@Column註解 指定的字段長度和類型與數據庫不符 - columnDefinition

我在實體類定義了一個字段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頁在其中查看. 直接複製粘貼過來就餓能用.
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章