今天遇到了几问题 .我在实体类定义了一个字段orgId将它的长度定义为5,启动项目后查看org_id字段时,发现该字段的长度为11(mysql默认的int类型的指定长度). 这说明我们设置的length 参数有问题
如果在实体类中将long类型的startTime字段长度设置为length=15 ,在mysql中生成的表的类型和字段变成了bigint类型长度为20. 实例类startTime字段我期望的是在数据库中是int类型长度为15.这也不符合我的预期.
在spring中 默认将 int类型的变量转为数据库的int类型
将string类型转为varchar类型
将long类型转为bigint类型
date 依然是date类型
@Entity
@Table(name = "user", indexes ={
@Index(name = "id", columnList="id"),
})
public class UserDo implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
/**
* 组织id
*/
@Column(name = "org_id", nullable = false, length = 5)
private int orgId;
/**
* 协议生效时间
*/
@Column(name= "starttime", nullable = true, length = 15)
private long startTime;
我查看@Column的注解看到length参数的描述. 如下图
(如果使用idea查看源码时,没有相应的注释,在这个类的右上角有一个Download Sources 将源码下载下来就可以看见了)
源码中对length参数的描述是,它仅对字符串类型的起作用,这也就解释了为什么设置的length不管用了.
@Column中能指定长度的就这一个参数,如果需要指定长度只能使用columnDefinition参数了.
columnDefinition是一个可选参数,它可以设置字段的属性,如: 参数类型,长度是否为空等.它只在创建DDL语句时起作用.
基本上我们在@Column其他参数中无法找到对字段的设置时,columnDefinition都可以完成.
如果想让数据库中的字段和长度按照我们希望的方式创建,我们改写一下实体类.
在@Column中加上columnDefinition参数columnDefinition=“int(15)” 这样我们创建的参数就可以是自定的类型和长度了.
@Entity
@Table(name = "user", indexes ={
@Index(name = "id", columnList="id"),
})
public class UserDo implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
/**
* 组织id
*/
@Column(name = "org_id", nullable = false, columnDefinition="int(5)")
private int orgId;
/**
* 协议生效时间
*/
@Column(name= "starttime", nullable = true, columnDefinition="int(15)")
private long startTime;
columnDefinition参数也可以指定多个字段属性. 我在下面列举几个.
- 设置double和long类型的精度, @Column 中的precision和scale参数指定指定数据库BigDecimal类型的精度,如果要指定double和long类型的精度,也可以使用columnDefinition
# 长度为5, 小数点后保留2位
columnDefinition="decimal(5,2)
- 设置为不等于null, 和注解@Column中的nullable = false相同
columnDefinition="varchar(128) not null"
- 编程语言中字符串一般都用String表示,但是数据库中varcahr数值类型有长度限制,一旦需要大文本,则需要text数值类型
columnDefinition="text"
- 设置date类型 等同于 @Temporal(TemporalType.xxxx)
columnDefinition="date"
columnDefinition="datetime"
对于columnDefinition参数的值该如何写不清楚的话,可以现在数据库中将表中的字段按照我们的需要创建好,然后使用Navicat工具在设计表中找到 SQL预览Tab页在其中查看. 直接复制粘贴过来就饿能用.