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);

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