Hibernate5的学习笔记(三)之注解解读

深圳的天气开始转暖了,也开始可以抢春节的火车票了,咱们的学习速度要和火车的速度一样的话,一定从今往后一旺到底的。

继续来探索hibernate的知识点

1、Hibernate中配置文件中数据类型date与timestamp区别

我们的小伙伴要是字段类型是private Timestamp time这样的该怎么去映射到hibernate呢,是不是需要加注解@Temporal(xxx)

首先我们先要了解数据库的字段类型有date、time、datetime,

  1. date表示日期,其范围为1000-01-01到9999-12-31
  2. datetime表示日期时间,其范围是1000-01-01 00:00:00到9999-12-31 23:59:59
  3. 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也是这样的解释:

Hibernate5的学习笔记(三)之注解解读_第1张图片

目前我的做法还是很老套的,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框架将忽略该属性.

Hibernate5的学习笔记(三)之注解解读_第2张图片

注解的解读:

  1. @Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用.
  2. name:表示数据库表中该字段的名称,默认情形属性名称一致
  3. nullable:表示该字段是否允许为null,默认为true
  4. unique:表示该字段是否是唯一标识,默认为false
  5. length:表示该字段的大小,仅对String类型的字段有效 ,默认为255个字符
  6. insertable:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为true(insertable和updatable属性一般多用于只读的属性,例如主键和外键等
  7. updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true.对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段.
  8. columnDefinition(大多数情况,几乎不用):表示该字段在数据库中的实际类型.通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是 TIMESTAMP.表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。columnDefinition属性用于覆盖数据库DDL中的语句,真是无知无惧。)
  9. 此外,String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB或TEXT字段类型,该属性非常有用.
  10. unique 表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。
  11.  table 表示当映射多个表时,指定表的表中的字段。默认值为主表的表名。
  12. 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() {
             ..........
                }
        }

 

 

 

你可能感兴趣的:(Hibernate5,注解开发,java,ssh,Hibernate)