@Column注解 指定的字段长度和类型与数据库不符 - columnDefinition

2023-01-19 13:48:33

今天遇到了几问题 .我在实体类定义了一个字段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参数也可以指定多个字段属性. 我在下面列举几个.

  1. 设置double和long类型的精度, @Column 中的precision和scale参数指定指定数据库BigDecimal类型的精度,如果要指定double和long类型的精度,也可以使用columnDefinition
# 长度为5, 小数点后保留2位
columnDefinition="decimal(5,2)  
  1. 设置为不等于null, 和注解@Column中的nullable = false相同
columnDefinition="varchar(128) not null"
  1. 编程语言中字符串一般都用String表示,但是数据库中varcahr数值类型有长度限制,一旦需要大文本,则需要text数值类型
columnDefinition="text"
  1. 设置date类型 等同于 @Temporal(TemporalType.xxxx)
columnDefinition="date"
columnDefinition="datetime"

对于columnDefinition参数的值该如何写不清楚的话,可以现在数据库中将表中的字段按照我们的需要创建好,然后使用Navicat工具在设计表中找到 SQL预览Tab页在其中查看. 直接复制粘贴过来就饿能用.
在这里插入图片描述

  • 作者:起止洺
  • 原文链接:https://blog.csdn.net/qq_35976271/article/details/101015057
    更新时间:2023-01-19 13:48:33