• 在Hibernate中使用注解,主要是为了替代映射文件,完成“类到表,属性到字段”的映射。
  • JPA提供了一套功能强大的注解。Hibernate直接使用了JPA的这套注解。当然,对于JPA中的一些不足,Hibernate又开发了一些自己的注解。这些注解要么继承自JPA,要么是独立的注解,作为JPA的补充。故,我们使用的注解,基本是javax.persistence.Transient包中的。
  • 使用注解需要注意以下几点:
    1、使用的均为javax.persistence.Transient包中的注解。
    2、不再需要映射文件。
    3、在Hibernate主配置文件中无需指定映射文件,但是需要指定注解的实体类。
        
        
        

    1 Hibernate基本注解

  • 根据其注解的位置与完成的功能。Hibernate注解可分为两种:类级注解、属性级注解。
  • 类级注解:注解在类的头部。完成类到表的映射。
  • 属性级注解:注解在属性上面,或者属性的get方法上面,完成属性到字段的映射。

    1.1 类级注解

    1.1.1 @Entity

  • 用在POJO类上,表示当前类为实体类。name属性为实体名称。默认为类的非限定性类名。一般使用默认值。
    SSH框架之Hibernate5专题9:Hibernate注解式开发_第1张图片

    1.2.1 @Table

  • 与@Entity联合使用。name属性指定映射的表名。默认与实体名称相同。
    SSH框架之Hibernate5专题9:Hibernate注解式开发

    1.2 属性级注解

  • 属性级注解根据其注解属性的不同,又可分为两类:主键相关注解,与普通属性注解。

    1.2.1 主键相关注解

    SSH框架之Hibernate5专题9:Hibernate注解式开发
    1、@Id

  • 用在主键id属性上,或者其get方法上,表示当前属性将对应数据库中的主键。
    SSH框架之Hibernate5专题9:Hibernate注解式开发_第2张图片
    2、@GeneratedValue
  • 将指定主键值的来源,其属性strategy用于指定主键的生成策略。其值为系统定义好的四种策略之一。默认为AUTO。
    SSH框架之Hibernate5专题9:Hibernate注解式开发_第3张图片
  • GenerationType.AUTO:根据底层数据库自动选择(默认)若数据库支持自增长,则为自增长。类似于配置文件中的native生成策略。
  • 在MySql中使用该策略,自动选择了Sequence生成方式。即主键值来自于序列表,而序列表由DB自己维护。查看数据库中可以看到,其创建了两个表,一个是映射表t_student,另一个则是序列表hibernate_sequence。
  • 后台报错,查看错误信息 ,提示需要填充该序列表:you need to populate the table:
    hibernate_sequence。打开表 hibernate_sequence,发现表中为空,即序列为空。需要为序列表指定一个初始值。填值为1后,再运行就不报错了。
  • GenerationType.IDENTITY:根据数据库的Identity字段生成。类似于配置文件中的identity生成策略。
  • GenerationType.SEQUENCE:使用Sequence来决定主键的取值。类似于配置文件中的Sequence生成策略。
  • Generation.TABLE:使用指定表来决定主键取值,结合@TableGenerator使用。
  • 注解中的生成策略只有四种。若要使用Hibernate映射文件中的主键生成器,则可以使用@GenericGenerator指定一个Hibernate主键生成器,再使用@GenerateValue的属性generator来引用即可。
    SSH框架之Hibernate5专题9:Hibernate注解式开发_第4张图片

    1.2.2 普通属性相关注解、

    SSH框架之Hibernate5专题9:Hibernate注解式开发_第5张图片
    1、@Column

  • 可将属性映射到列中,描述了数据库表中该字段的详细定义。该注解的属性较多。
  • name:可选,表示DB中该字段的名称,默认与属性名相同;
  • nullable:可选,表示该字段是否允许为null,默认值为true;
  • unique:可选,表示该字段是否唯一,默认为false;
  • length:可选,表示该字段的大小,仅对String类型的字段有效,默认值为255;
  • insertable:可选,表示该字段是否可以出现在insert语句中,默认值为true,通常为主键、时间戳等字段的值设置为false。因为它们的值都是自动生成的,不需要在insert时插入;
  • updateable:可选,表示该字段是否可以出现在update语句中。默认为true。通过对于一经创建就不用修改的字段,如birthday、gender等,可将该值设置为false;
  • table:可选。当前字段所在的表,默认为当前表;
  • precision和scale:表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数;
  • columnDefinition:可选。用于覆盖数据库DDL建表语句中对于该字段的创建语句。

2、@Basic:表示该字段将映射到DB中,是属性的默认注解;
3、@Transient:表示该字段不映射到DB中,该注解无属性;

2 关联关系映射注解

2.1 一对多单向关联

  • @OneToMany表明是一对多关联关系;
  • @JoinColumn指明该属性所关联的外键;
    SSH框架之Hibernate5专题9:Hibernate注解式开发_第6张图片
  • targetEntity:指明该属性所关联的类。
  • cascade:指定级联类型。其为数组,使用多种级联,则可使用{}赋值。其值为Cascade常量。
  • 对于这些常量需要注意,由于Hibernate注解通常使用的是JPA的注解,所以这里的级联,是针对于JPA方法执行时的级联,对于Hibernate方法,如save()、delete()、update()等的执行,下面对应的级联是不起作用的。但是,Cascade.ALL是起作用的。所以,注解中的级联一般使用Cascade.ALL。
    SSH框架之Hibernate5专题9:Hibernate注解式开发_第7张图片

    2.2 一对多双向关联

  • 在一方中增加了mappedBy属性。
    SSH框架之Hibernate5专题9:Hibernate注解式开发_第8张图片
  • mappedBy属性用法:
    1、该属性与关联关系的维护权相关;
    2、该属性应放在放弃维护权一方;
    3、该属性值为对方的关联属性,表明以后的关联关系将由它来负责;
    4、该属性只可能在双向关联中使用;
    5、使用了该属性,将不能够再使用@JoinColumn注解。因为@JoinColumn注解表示其所注解的属性将来通过set方法设值后,会与DB中哪个字段相关联。
  • mappedBy属性表示当前注解的关联属性放弃了维护权,即使执行了set方法将值设置,其也不会写入到DB中。
  • 也正是因为放弃了维护权,与DB无关,所以设置mappedBy属性的注解,再设置cascade也就无意义。
  • 一个是使被注解者与DB相关,一个是使被注解者放弃与DB的关系,他们是相互矛盾的。
    SSH框架之Hibernate5专题9:Hibernate注解式开发_第9张图片

2.3 自关联

SSH框架之Hibernate5专题9:Hibernate注解式开发_第10张图片
SSH框架之Hibernate5专题9:Hibernate注解式开发_第11张图片

2.4 多对一单向关联

SSH框架之Hibernate5专题9:Hibernate注解式开发_第12张图片
SSH框架之Hibernate5专题9:Hibernate注解式开发_第13张图片

2.5 多对多单向关联

  • 多对多关联使用@ManyToMany注解。其会自动生成一个中间表,表名为两个关联对象的映射表名的联合:表1_表2。只不过,谁在维护关联关系,谁的表名在前。
  • 该中间表会包含两个字段,字段名与谁在维护关联关系相关。谁在维护关联关系,谁的表名将出现在第一个字段名中,而该类的关联属性名将出现在第二个字段名中。字段名分别为表名_id与关联属性名_id。
  • 当然,默认的表名和字段名均可通过@JoinTable进行修改。
    SSH框架之Hibernate5专题9:Hibernate注解式开发_第14张图片
    SSH框架之Hibernate5专题9:Hibernate注解式开发_第15张图片
    SSH框架之Hibernate5专题9:Hibernate注解式开发_第16张图片

    2.6 多对多双向关联

  • 多对多双向关联时,需要某一方放弃关联关系维护权。否则,将会生成两张中间表:
    SSH框架之Hibernate5专题9:Hibernate注解式开发_第17张图片
    SSH框架之Hibernate5专题9:Hibernate注解式开发_第18张图片

    3 二级缓存注解@Cache

  • 二级缓存,使用注解式开发,其注解主要替换的是配置文件中对类缓存对象以及集合缓存对象的指定配置。至于在主配置文件中开启二级缓存、注册二级缓存区域工厂,仍然还是需要的。
  • 对于查询缓存,没有相应的注解。
  • 对于类缓存和集合缓存的注解,主要使用@Cache注解。其由一个属性usage,用于指定二级缓存所使用的事务并发访问策略。其取值为一个枚举型CacheConcurrencyStrategy常值,该枚举常量具有5个常量值:
    1、NONE:不使用并发访问策略;
    2、NONSTRICT_READ_WRITE:非严格读写策略;
    3、READ_ONLY:只读策略;
    4、READ_WRITE:读写策略;
    5、TRANSACTIONAL:事务策略;