慕课网:http://www.imooc.com/learn/524
一、类级别注解
- 简介
使用注解的目的:为了简化繁琐的ORM映射文件(*.hbm)的配置
JPA(Java Persistence API)与hibernate的关系:JPA是标准接口,hibernate是实现(hibernate的功能是jpa的超集,功能更强大)
hibernate如何实现与JPA的关系:通过hibernate-annotation、hibernate-entitymanager、hibernate-core三个组件来实现
一般在实际开发中,优先考虑使用JPA注解,有利于移植和扩展
hibernate注解的分类:
-
- 类级别注解
- @Entity:实体类--对应数据库的表
- @Table:
- @Embeddable:嵌入类
- 属性级别注解
- 映射关系注解
- 类级别注解
- 准备工作
- @Entity
@Entity:映射实体类
@Entity(name="tableName")
name:可选,对应数据库中的一个表。若表名与实体名相同,则可以省略。
注:使用@Entity时必须指定实体类的主键属性。
- @Table(name="",catalog="",schema="")
与@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表信息。
name:可选,映射表名称,默认表名和实体名一致,只有在不一致的情况下才需要指定表名。
catalog:可选,表示catalog名称,默认为catalog("")
schema:可选,表示schema名称,默认为schema("")
- @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等主键生成方式
- @Column
@Column:可以讲属性映射到列,使用该朱姐来覆盖默认值,@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成
数据库表结构的工具非常有用
常用属性:
- name:可选,表示数据库表中该字段的名称,默认情况与属性名一致。
- nullable:可选,表示该字段是否允许为null,默认为ture。
- unique:可选,表示该字段是否是唯一标识,默认为false。
- length:可选,标识该字段大小,仅对String字段类型有效,默认值255。(如果是主键不能使用默认值)
- insertable:可选,标识在ORM框架执行插入操作时,该字段是否应出现在INSERT语句中,默认为ture。
- updateable:可选,表示再ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段。
[email protected]
@Embedded是注释性的,表示该属性的类是嵌入类
注意:同时嵌入类也必须标注@ Embeddable 注解
[email protected]
@EmbeddedId使用嵌入式逐渐类实现复合主键。
注意:嵌入式主键类必须实现Serializable接口,必须有默认的public无参数构造方法,必须覆盖equals和hashCode方法。
[email protected]
可选,表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,如果一个属性并非数据库表的字段映射,就无比将其标示为@Transient,否则ORM框架默认其注解为@Basic。
三、关联映射注解
实体之间的映射关系:
- 一对一:一个公民对应一个身份证号码
- 一对多(多对一):一个公民有多个银行账号
- 多对多:一个学生多个老师,一个老师教多个学生
1. 一对一单向外键
- @OneToOne(cascade=CascadeType.ALL)
- cascade:级联关系
- @JoinColumn(name="pid",unique=true)
注意:保存时应先保存外键对象,再保存主表对象
2. 一对一双向外键关联
- 主控方的配置同一对一单向外键关联
- 被控方添加@OneToOne(mappenBy="card")
注意:双向关联,必须设置mappedmappedBy属性。因为双向关联只能交给一方去控制,不可能在双方都设置外键保存关联关系,否则双方都无法保存。
- 一对一双向外键联合主键
- 创建主键类
- 主键类必须实现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