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