解决springbootjpa@ColumncolumnDefinition等属性失效
问题
⽬录
jpa @Column columnDefinition属性失效
原因
例如
jpa column注解
知识点
precision和scale疑点
⼩结⼀下
jpa @Column columnDefinition属性失效
删除⼀条属性,默认false
#spring.jpa.properties.hibernate.globally_quoted_identifiers=true
原因
开启后, 创建sql语句执⾏时会添加'`', 会造成columnDefinition 属性失效, author: dreamlu
例如
1.属性设置为true
alter table `xxx` add column `xxx` `varchar(50) default ''`
// sql 语法错误
2.属性为false
alter table xxx add column xx varchar(50) default ''
// 执⾏成功
可以看出:有舍有得,第⼆种要求字段/表等命名不能和mysql或其他数据库中关键字重名
jpa column注解
知识点
@Column注解⼀共有10个属性,这10个属性均为可选属性,各属性含义分别如下:
name:name属性定义了被标注字段在数据库表中所对应字段的名称;
unique:unique属性表⽰该字段是否为唯⼀标识,默认为false。如果表中有⼀个字段需要唯⼀标识,则既可以使⽤该标记,也可以使⽤@Table标记中的@UniqueConstraint。
nullable :nullable属性表⽰该字段是否可以为null值,默认为true。
insertable :insertable属性表⽰在使⽤“INSERT”脚本插⼊数据时,是否需要插⼊该字段的值。
updatable:updatable属性表⽰在使⽤“UPDATE”脚本插⼊数据时,是否需要更新该字段的值。insertable和updatable属性⼀般多⽤于只读的属性,例如主键和外键等。这些字段的值通常是⾃动⽣成的。
columnDefinition :columnDefinition属性表⽰创建表时,该字段创建的SQL语句,⼀般⽤于通过Entity⽣成表定义时使⽤。
(也就是说,如果DB中表已经建好,该属性没有必要使⽤。)
table :table属性定义了包含当前字段的表名。
length :length属性表⽰字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。
precision和scale :precision属性和scale属性表⽰精度,当字段类型为double时,precision表⽰数值的总长度,scale表⽰⼩数点所占的位数。
precision和scale疑点
@Table(name = "CUSTOMERS")
@Entity
public class Customer {
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Integer id;
@Column(name = "Name")
private String name;
@Column(name = "Email", nullable = true, length = 128)
private String email;springboot推荐算法
@Column(name = "Age")
private int age;
@Column(name = "Remark", columnDefinition = "text")
private String remark;
@Column(name = "Salary1", columnDefinition = "decimal(5,2)")
private double salary1;
@Column(name = "Salary2", precision = 5, scale = 2)
private double salary2;
@Column(name = "Salary3", columnDefinition = "decimal(5,2)")
private BigDecimal salary3;
@Column(name = "Salary4", precision = 5, scale = 2)
private BigDecimal salary4;
......
}
数据库DDL:
CREATE TABLE `customers` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Age` int(11) DEFAULT NULL,
`Email` varchar(128) DEFAULT NULL,
`Name` varchar(255) DEFAULT NULL,
`Remark` text,
`Salary1` decimal(5,2) DEFAULT NULL,
`Salary2` double DEFAULT NULL,
`Salary3` decimal(5,2) DEFAULT NULL,
`Salary4` decimal(5,2) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
⼩结⼀下
1.double类型若在columnDefinition属性中指定数字类型为decimal并指定精度,则最终以columnDefinition为准(oracle数据库中除外,其指定为float类型,因为oracle数据库没有double类型,若针对oracle数据库进⾏精确,则改为
@Column(name = "Salary1", columnDefinition = "decimal(5,2)") //或columnDefinition = "number(5,2)"
private Float salary1;
2.double类型将在数据库中映射为double类型,precision和scale属性⽆效
3.BigDecimal类型在数据库中映射为decimal类型,precision和scale属性有效
4.precision和scale属性只在BigDecimal类型中有效
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论