深圳的天气开始转暖了,也开始可以抢春节的火车票了,咱们的学习速度要和火车的速度一样的话,一定从今往后一旺到底的。
继续来探索hibernate的知识点
1、Hibernate中配置文件中数据类型date与timestamp区别
我们的小伙伴要是字段类型是private Timestamp time这样的该怎么去映射到hibernate呢,是不是需要加注解@Temporal(xxx)
首先我们先要了解数据库的字段类型有date、time、datetime,
- date表示日期,其范围为1000-01-01到9999-12-31
- datetime表示日期时间,其范围是1000-01-01 00:00:00到9999-12-31 23:59:59
- timestamp表示时间戳,1970-01-01 00:00:00到2038-01-19 03:14:07,timestamp具有自动初始化和自动更新功能。
@Temporal都是加在字段上或者加在getXXX()方法上
Temporal注解的作用就是帮Java的Date类型进行格式化,一共有三种注解值:
第一种:@Temporal(TemporalType.DATE)——>实体类会封装成日期“yyyy-MM-dd”的 Date类型。
第二种:@Temporal(TemporalType.TIME)——>实体类会封装成时间“hh-MM-ss”的 Date类型。
第三种:@Temporal(TemporalType.TIMESTAMP)——>实体类会封装成完整的时间“yyyy-MM-dd hh:MM:ss”的 Date类型。
一开始我以为使用该标注后,该属性的值会被自动赋值。不需要在插入数据时,给该属性赋值。哈哈哈,太年轻,其实并不会更何况这个注解是针对在某类中有Date类型的属性。
我相信一定也会有TIMESTAMP类型的格式化的,但是看官网api也是这样的解释:
目前我的做法还是很老套的,name.setDelTime(new Timestamp(System.currentTimeMillis()));
我也想找点先进的方法比如将TimeStamp类型的改成Date类型,然后再加注解,当然是成功了才告诉你们的啦~~
@Column(name = "time")
@Temporal(TemporalType.TIMESTAMP)
@UpdateTimestamp 这个注解是和@DynamicUpdate同效果,两个一起用倒是会失效
public Date getTime() {
return time;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name ="createdOn",updatable = false)
//让其更新的时候不更新值,需要在实体类上加@DynamicUpdate,
//如果是使用了@DynamicUpdate其他需要改变的值就要设置,不使用的话就直接在对应字段使用
@org.hibernate.annotations.CreationTimestamp
public Date createdOn;
2、Hibernate中save,update,saveOrUpdate的用法和区别
在Hibernate中实体类PO会有三种状态的变化trasient(自由态),persistent(持久态),detached(游离态)。
当新new一个PO,new ApplePO(“xxx”)的时候还没有和session关联这时候是po的实例处于transient自由态。
例如利用session通过get()和load()得到的PO是和数据库建立了映射关系的PO实体类处于persisent持久态。
虽然从get和load获取的PO是属于持久态,但是使用delete(PO)的时候这个PO就成了游离态,当然还是有办法挽救的,游离态的PO通过save()或者saveOrUpdate()可以将其变回持久态persistent。
还有一种情况就是 当把session关闭时,session缓存中的persistent的po对象也变成detached。
因关闭session而变成游离态的可以通过lock、save、update变成持久态。
3、Hibernate实体类的注解@Column属性解读
不加这个注解你会死的很惨,有以下的错误就要注意了!!!
Hibernate会直接在你的数据库里增加未添加注解的字段,当不是数据库的字段一定要加上@Transient。
@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.
注解的解读:
- @Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用.
- name:表示数据库表中该字段的名称,默认情形属性名称一致
- nullable:表示该字段是否允许为null,默认为true
- unique:表示该字段是否是唯一标识,默认为false
- length:表示该字段的大小,仅对String类型的字段有效 ,默认为255个字符
- insertable:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为true(insertable和updatable属性一般多用于只读的属性,例如主键和外键等)
- updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true.对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段.
columnDefinition(大多数情况,几乎不用):表示该字段在数据库中的实际类型.通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是 TIMESTAMP.表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。columnDefinition属性用于覆盖数据库DDL中的语句,真是无知无惧。)- 此外,String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB或TEXT字段类型,该属性非常有用.
- unique 表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。
- table 表示当映射多个表时,指定表的表中的字段。默认值为主表的表名。
- precision和scale precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。
4、Hibernate的@Embedded
/**@Embedded将几个字段组合成一个类,并作为整个Entity的一个属性.
例如User包括id,name,city,street,zip属性.
我们希望city,street,zip属性映射为Address对象.这样,User对象将具有id,name和address这三个属性.
Address对象必须定义为@Embededable
示例:*/
@Embeddable
public class Address {
city,street,zip
}
@Entity
public class User {
@Embedded
public Address getAddress() {
..........
}
}