hibernate注解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate注解相关的知识,希望对你有一定的参考价值。

慕课网:http://www.imooc.com/learn/524
一、类级别注解
  1. 简介
          使用注解的目的:为了简化繁琐的ORM映射文件(*.hbm)的配置
          JPA(Java Persistence API)与hibernate的关系:JPA是标准接口,hibernate是实现(hibernate的功能是jpa的超集,功能更强大)
          hibernate如何实现与JPA的关系:通过hibernate-annotation、hibernate-entitymanager、hibernate-core三个组件来实现
          一般在实际开发中,优先考虑使用JPA注解,有利于移植和扩展
          hibernate注解的分类:
    • 类级别注解
      • @Entity:实体类--对应数据库的表
      • @Table:
      • @Embeddable:嵌入类
    • 属性级别注解
    • 映射关系注解
 
  1. 准备工作
  2. @Entity
          @Entity:映射实体类
          @Entity(name="tableName")
               name:可选,对应数据库中的一个表。若表名与实体名相同,则可以省略。
          注:使用@Entity时必须指定实体类的主键属性。
  1. @Table(name="",catalog="",schema="")
          与@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表信息。
          name:可选,映射表名称,默认表名和实体名一致,只有在不一致的情况下才需要指定表名。
          catalog:可选,表示catalog名称,默认为catalog("")
          schema:可选,表示schema名称,默认为schema("")
 
  1. @Embeddable
          表示一个非Entity类,可以嵌入到另一个实体类中作为属性而存在。
          
     
二、属性级别注解
     添加方式:
  • 写在属性字段上面
  • 写在属性的get访问器上面
     重要:@Id、@GeneratedValue、@Column、@Embedded、@EmbeddedId、@Transient
     @SequenceGenerator、@Lob、@Version、@Basic。。
     1.Id
     @Id:必须,定义了映射到数据库表的主键属性,一个实体类可以有一个或者多个属性被映射为主键,可以置于主键属性或者getXxx()前
     注意:如果有多个属性定义为主键属性,该实体类必须实现serializable接口。
     2.GeneratedValue
     @GeneratedValue(strategy=GenerationType,generator=""):可选,用于定义主键生成策略。
     strategy表示主键生成策略,取值有:
  • GeneratedType.AUTO:根据地层数据库自动选择(默认)
    • 字符串类型主键不能使用 GeneratedType.AUTO,可以使用  @GeneratedValue(generator="id")[email protected](name="id",strategy="assigned/uuid")
  • GeneratedType.IDENTITY:根据数据库的Identity字段生成
  • GeneratedType.SEQUENCE:使用Sequence来决定主键的取值
  • GeneratedType.TABLE:使用指定表来决定主键取值,结合@TableGenerator使用
               如:
          @Id
          @TableGenetor(name="tab_cat_gen",allocationSize=1)
          @GeneratedValue(strategy=GenerationType.Table)
     Genetor-表示主键生成器的名称,这个属性通常和ORM框架有关
          例如:Hibernate可以指定uuid等主键生成方式
    
  1. @Column
          @Column:可以讲属性映射到列,使用该朱姐来覆盖默认值,@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成
数据库表结构的工具非常有用
     常用属性:
  • name:可选,表示数据库表中该字段的名称,默认情况与属性名一致。
  • nullable:可选,表示该字段是否允许为null,默认为ture。
  • unique:可选,表示该字段是否是唯一标识,默认为false。
  • length:可选,标识该字段大小,仅对String字段类型有效,默认值255。(如果是主键不能使用默认值)
  • insertable:可选,标识在ORM框架执行插入操作时,该字段是否应出现在INSERT语句中,默认为ture。
  • updateable:可选,表示再ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段。
 
@Embedded是注释性的,表示该属性的类是嵌入类
注意:同时嵌入类也必须标注@ Embeddable 注解
 
     @EmbeddedId使用嵌入式逐渐类实现复合主键。
     注意:嵌入式主键类必须实现Serializable接口,必须有默认的public无参数构造方法,必须覆盖equals和hashCode方法。
 
      可选,表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,如果一个属性并非数据库表的字段映射,就无比将其标示为@Transient,否则ORM框架默认其注解为@Basic。   
 
三、关联映射注解
实体之间的映射关系:
  • 一对一:一个公民对应一个身份证号码
  • 一对多(多对一):一个公民有多个银行账号
  • 多对多:一个学生多个老师,一个老师教多个学生
 
     1. 一对一单向外键
  • @OneToOne(cascade=CascadeType.ALL)
    • cascade:级联关系
  • @JoinColumn(name="pid",unique=true)
     注意:保存时应先保存外键对象,再保存主表对象
 
     2. 一对一双向外键关联
  • 主控方的配置同一对一单向外键关联
  • 被控方添加@OneToOne(mappenBy="card")
     注意:双向关联,必须设置mappedmappedBy属性。因为双向关联只能交给一方去控制,不可能在双方都设置外键保存关联关系,否则双方都无法保存。
 
  1. 一对一双向外键联合主键
  • 创建主键类
  • 主键类必须实现serializable接口,重写hashCode()和equals()方法。
主键类:@Embeddeble
实体类:@EmbeddedId
 
     4.多对一单向外键关联
  • 多方持有一方的引用,比如:多个学生对应一个班级(多对一)
     @ManyToONe(cascade={CascadeTypie.ALL},fetch=FetchType.EAGER) cascade:级联关系 fetch:抓取策略
      @JoinColumn(name="cid",refencedColumnName="CID")
 
     5.一对多单向外键关联
  • 一方持有多方的集合,一个班级有多个学生(一对多)
     @OneToMany(cascade={CascadeType.ALL},fetcj=FetchType.LAZY)
     @JoinColumn(name="cid")
     总结:多对一的时候,多方设置EAGER,一方设置LAZY
 
     6.一对多(多对一)双向外键关联
  • 多方:多方持有一方的引用
     @ManyToONe(cascade={CascadeTypie.ALL},fetch=FetchType.EAGER) cascade:级联关系 fetch:抓取策略
      @JoinColumn(name="cid")
  • 一方:一方持有多方的集合
     @OneToMany(cascade={CascadeType.ALL},fetcj=FetchType.LAZY)
     @JoinColumn(name="cid")
 
     7.多对多单向外键关联
  • 学生和教师构成多对多的关联关系
  • 其中一个多方持有另一个多方的集合对象(学生持有教师的集合)
  • 创建中间表
     // 学生类
     @ManyToMany
     @JoinTable(
          name="teachers_students",
          joinColumns={@JoinColumn(name="sid")},
          inverseJoinColumns={@JoinColumn(name="tid")}
     )
 
     8.多对多双向外键关联
  • 双方都持有对方的集合对象,其中一方设置
// 教师类
@ManyToMany(mappedBy="teachers")
  • 另一方:
// 学生类
@ManyToMany
@JoinTable(
          name="teachers_students",
          joinColumns={@JoinColumn(name="sid")},
          inverseJoinColumns={@JoinColumn(name="tid")}
     )
 
四、总结
1.类级别注解
@Entity @Table @Embeddable
2.属性级别注解
@Id @GeneratedValue @Column @Embeded @EmbededId @Transient
3.映射关系注解
一对一单向外键:@OneToOne
一对一双向外键关联:@OneToOne(mappedBy="xxx")
一对一单向外键联合主键:@Embeddable @EmbeddedId
多对一单向外键关联:@ManyToOne @JoinColumn
一对多单向外键关联:@OneToMany @JoinColumn
一对多双向外键关联: @ManyToOne  @OneToMany  @JoinColumn
多对多单向外键关联:@ManyToMany @JoinTable
多对多双向外键关联: @ManyToMany(mappedBy="xxx") @JoinTable

以上是关于hibernate注解的主要内容,如果未能解决你的问题,请参考以下文章

关于使用hibernate注解总结

[Hibernate] 注解映射例子

Hibernate注解-类级别注解

Hibernate-注解

使用Hibernate 注解

Hibernate注解配置