JPA 自動建表(4)- @Column

/**
 * @javax.persistence.Column(name="xxx",unique=false,nullable=true) 指定當前屬性所要映射字段
 *         name        表中所對應字段的名稱【默認值:與屬性名一致】
 *         unique      該字段是否爲唯一約束字段 【默認值 FALSE】
 *         nullable    能否爲null值 【默認值:TRUE】
 *         insertable  insert 語句是否要包含該字段 【默認值:TRUE】
 *         updatable   update 語句是否要包含該字段 【默認值:TRUE】
 *         length      【只對 String 有效】字段的長度【默認長度:255】
 *         precision   當字段類型爲 double 時,precision表示數值的總長度
 *         scale       當字段類型爲 double 時,scale表示小數位數 
 *         columnDefinition   聲明建表語句,
 *              @Column(columnDefinition = "varchar(32) not null")
 *              默認情況下 String轉varchar,如果想要轉BLOB或TEXT,需要手動指定:@Column(columnDefinition="text")
 *                  
 *    insertable 和 updatable 屬性一般多用於只讀的屬性,例如主鍵和外鍵等。這些字段的值通常是自動生成的,而且不能修改
 */

 

看以下舉例:

默認方式,不使用 @Column

// 默認方式創建字段 ,不使用 @Column
private String name;
【創建的字段】
 name varchar(255) DEFAULT NULL,

使用@Column

@Column(name = "userName", length = 32 ,unique = true)  // 駝峯命名 轉 下劃線【JPA 默認方式】
private String name;
【創建的字段】
 user_name  varchar(32) DEFAULT NULL,
 UNIQUE KEY  `UK_2kehtjb1w395oq5vtys8e79u1`  (`user_name`)

創建 text 類型字段

/**
 * @javax.persistence.Lob
 *      將當前屬性映射成數據庫的大對象類型,clob 或 blog
 * @javax.persistence.Basic
 *      clob or blob 內存空間比較大,通常使用延遲加載的方式,即 fetch = FetchType.LAZY
 *
 * 默認情況下 String 轉 varchar ,如果想要轉 blob 或 text ,需要手動指定 columnDefinition="text"
 */

@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "content",columnDefinition = "text")
private String content;
【創建的字段】
content  text

 創建小數類型字段

// 對 Float,Double 數據類型: precision , scale 不起作用 
@Column
(precision = 5,scale = 2) private Double price; -- 【創建的字段】 price double DEFAULT NULL @Column(precision = 5,scale = 2) private Float price; -- 【創建的字段】 price float DEFAULT NULL
// 對 BigDecimal: precision , scale 起作用
@Column(precision = 5,scale = 2)
private BigDecimal price;           --          【創建的字段】 price decimal(5,2) DEFAULT NULL
// 建議使用 columnDefinition 創建小數,使用這種方式時 Java 數據類型可以任意 Double , Float
@Column(columnDefinition = "decimal(5,2)")
private Double price;               --          【創建的字段】 price decimal(5,2) DEFAULT NULL

創建整數類型

// 默認長度 11
private Integer age1;              --           【創建的字段】 age1 int(11) DEFAULT NULL
    
// 修改長度
// 只能使用 columnDefinition 方式修改
// 因爲 @Column(length = 3) 屬性對數字不起作用   
@Column(columnDefinition = "int(3)" )
private Integer age2;              --           【創建的字段】age2 int(3) DEFAULT NULL

時間 和 Boolean

/**
 * 在數據庫創建的字段: is_show bit(1) DEFAULT NULL
 *  true    對應的值 1
 *  false   對應的值 0
*/
private Boolean isShow;

/**
 * 在數據庫創建的字段:create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 *      當《新增》一條記錄時 ,由數據庫來自動爲 createTime 賦值爲當前時間【即,由數據庫來維護 createTime 】
 *      insertable = false , updatable = false 表示當 Hibernate 執行 insert , update  語句時 ,語句裏不會出現 createTime
 *      由數據庫來維護的字段使用 insertable = false ,updatable = false 是非常合理的
 */
@Column(columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP",insertable = false,updatable = false)
private Timestamp createTime;

/**
 * 在數據庫創建的字段:update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
 *      當《新增》或《修改》記錄時 ,由數據庫來自動爲 updateTime 賦值爲當前時間【即,由數據庫來維護 updateTime 】
 *      insertable = false , updatable = false 表示當 Hibernate 執行 insert , update  語句時 ,語句裏不會出現 updateTime
 *      由數據庫來維護的字段使用 insertable = false ,updatable = false 是非常合理的
 */
@Column(columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP",insertable = false,updatable = false)
private Timestamp updateTime;
【測試:新增數據】創建時間 和 修改時間 由數據庫自動賦值爲當前時間
Test t = new Test();
t.setIsShow(true);
dao.save(t);

【測試:修改數據】修改時間 由數據庫自動修改成當前時間
Test t = new Test();
t.setId(1);
t.setIsShow(false);
dao.update(t);

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