深圳的天气开始转暖了,也开始可以抢春节的火车票了,咱们的学习速度要和火车的速度一样的话,一定从今往后一旺到底的。
继续来探索hibernate的知识点
我们的小伙伴要是字段类型是private Timestamp time这样的该怎么去映射到hibernate呢,是不是需要加注解@Temporal(xxx)
首先我们先要了解数据库的字段类型有date、time、datetime,
@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;
在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变成持久态。
不加这个注解你会死的很惨,有以下的错误就要注意了!!!
Hibernate会直接在你的数据库里增加未添加注解的字段,当不是数据库的字段一定要加上@Transient。
@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.
注解的解读:
/**@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() {
..........
}
}