1、类级别注解
a) @Entity @Table @Embeddable
2、属性级别注解
a) @Id @GeneratedValue @Column
b) @Embedded @EmbeddedId @Transient
第一章:类级别注解
1、hibernate注解介绍:使用注解的目的:为了简化繁琐的ORM映射文件(*.hbm)的配置。
2、JPA与hibernate的关系:什么是JAP?全称java Persistence API JPA注解是javaee的规范和标准。JPA是标准接口,hibernate是实现,但其功能是JPA的超集。hibernate如何实现与JPA的关系?通过hibernate-annotation、hibernate-entitymanager和hibernate-core三个组件实现。一般在实际开发中,优先考虑使用JPA注解,这样更有利于程序的移植和扩展。
3、Hibernate注解分类:类级别注解、属性级别注解、映射关系注解
4、@Entity
a) @entity:映射实体类
b) @entity(name=”tableName”)name:可选,对应数据库中的一个表。若表名与实体类名相同,则可以省略。注意:使用@Entity时必须指定实体类的主键属性(get放上上设置)。
5、@Table
a) @Table(name=””,catalog=””,schema=””)@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息。Name:可选,映射表的名称,默认表名和实体名称一致,只有在不一致的情况下才需要指定表名。Catalog-可选,表示catalog名称,默认为catalog(“”)。Schema-可选,表示schema名称,默认为schema(“”)。
6、@Embeddable
a) @Embeddable表示一个非Entity类可以嵌入到另一个Entity类中作为属性而存在。
7、@schema与catalog
a) 从实现的角度来看,各种数据库系统对Catalog和Schema的支持和实现方式千差万别的。
b)
8、
第二章:Hibernate属性级别注解
添加方式:
1、是写在属性字段上面
2、是写在属性的get访问器的上面
l @Id
l @SequenceGenerator
l @GeneratedValue
l @Column
l @Embedded
l @EmbeddedId
l @Lob
l @Version
l @Basic
l @Transient
@Id
l @Id:必须,定义了映射到数据库表的主键的属性,一个实体类可以有一个或者多个属性被映射为主键,可置于主键属性或者getXxxx()前。
l 注意:如果有多个属性定义为主键属性,该实体类必须实现serializable接口。(hibernate5.2 mysql5.7 不需要实现 serializable也可以)
@GeneratedValue
@GeneratedValue(strategy=GenerationType,generator=””):可选,用于定义主键生成策略。
Strategy表示主键生成策略,取值有:
1、GenerationType.AUTO:根据底层数据库自动选择(默认)
2、GenerationType.INDENTITY:根据数据库的Identity字段生成
3、GenerationType.SEQUENCE:使用Sequence来决定主键的取值
4、GenerationType.TABLE:使用指定表来决定主键取值,结合@TableGenerator使用
如:
@Id
@TableGenerator(name=”tab_cat_gen”,allocationSize=1)
@GeneratedValue(Strategy=GenerationType.Table)
Generator:表示主键生成器的名称,这个属性通常和ORM框架相关,例如:Hibernate可以指定uuid等主键生成方式
@Column
l @Column-可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用。
常用属性:
Name:可选,表示数据库表中该字段的名称,默认情况属性名称一致。
Nullable:可选,表示该字段是否允许为null,默认为true。
Unique:可选,表示该字段是否是唯一标识,默认为false。
Length:可选,表示该字段的大小,仅对string类型的字段有效,默认值为255。(如果是主键不能使用默认值)
Insertable:可选,表示ORM框架执行更新操作时,该字段是否应出现insert语句中,默认为true。
Updateable:可选,表示在ORM框架执行更新操作时,该字段是否应该出现在update语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段。
@Embedded
l @Embedded是注释属性的,表示该属性的类是嵌入类。
l 注意:同时嵌入类也必须标注@Embeddable注解。
@EmbeddedId
l @EmbeddedId使用嵌入式主键类实现复合主键。
l 注意:嵌入式主键类必须实现Serializable接口、必须有默认的public无参数的构造方法、必须覆盖equals和hashCode方法。
@Transient
l 可选,表示该属性并非一个到数据库表的字段的映射,ORM框架忽略该属性,如果一个属性并非数据库的字段映射,就务必将其标示为@Transient,否则ORM框架默认其注解为@Basic
第三章:关系映射级别注解
1、一对一单向外键 @OneToOne
2、一对一双向外键关联 @OneToOne(mappedBy=”xxx”)
3、一对一单向外键联合主键 @Embeddable @EmbeddedId
4、多对一单向外键关联 @ManyToOne @JoinColumn
5、一对多单向外键关联 @OneToMany @JoinColumn
6、一对多双向外键关联 @ManyToOne @OneToMany @JoinColumn
7、多对多单向外键关联 @ManyToMany @JoinTable
8、多对多双向外键关联 @ManyToMany(mappedBy=”xxx”) @JoinTable
实体之间的映射关系
l 一对一:一个公民对应一个身份证号码。
l 一对多(多对一):一个公民有多个银行账号。
l 多对多:一个学生有多个老师,一个老师有多个学生。
一对一单向外键
l @OneToOne(cascade=CascadeType.ALL)
l @JoinColumn(name=”pid”,unique=”true”)
l 注意:保存时应该先保存外键对象,再保存主表对象。
一对一双向外键
l 主控方的配置同一对一单向外键关联
l @OneToOne(mappedBy=”card”)//被控方
l 双向关联,必须配置mappedBy属性。因为双向关联只能交给一方去控制,不可能在双方都设置外键保存关联关系,否则双发都无法保存。
一对一双向外键联合主键
l 创建主键类
l 主键类必须实现serializable接口,重写hashCode()和equals()方法。
主键类
@Embeddable
实体类
@EmbeddedId
多对一单向外键
l 多方持有一方的引用,比如:多个学生对应一个班级(多对一)
@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
@JoinColumn(name=”cid”,referencedColumnName=”CID”)
@JoinColumn(name = "ClassRoom_ID",referencedColumnName = "cid"),应该是这样的,后面的cid表示 ClassRoom 的成员变量cid,表示Student表参照它生成列,列名叫ClassRoom_ID。生成以后,Student表会有一个列叫ClassRoom_ID,并且是 ClassRoom 的表的id属性对应的外键
一对多单向外键
l 一方持有多方的集合,一个班级有多个学生(一对多)。
@OneToMany(cascade={CascadeType=.ALL},fetch=FetchType.LAZY)
@JoinColumn(name=”cid”)
总结:多对一的时候,多方设置EAGER,一方设置LAZY
一对多(多对一)双向外键
l 多方:多方持有一方的引用。
n @ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
n @JoinColumn(name=”cid”)
l 一方:一方持有多方的集合
n @OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY)
n @JoinColumn(name=”cid”)
多对多单向外键
l 学生和教师构成多对多的关联关系
l 其中一个多方持有另一个多方的集合对象(学生持有教师的集合)
l 创建中间表
//学生类
@ManyToMany
@JoinTable(
Name=”teachers-students”,
joinColumns={@JoinColumn(name=”sid”)},
inverseJoinColumns={@JoinColumn(name=”tid”)}
)
多对多双向外键
l 双方持有对方的集合对象,其中一方设置
//教师端
@ManyToMany(mappedBy=”teachers”)
l 另一方
//学生端
@ManyToMany
@JoinTable(
Name=”teachers_students”,
joinColumns={@JoinColumn(name=”sid”)},
inverseJoinColumns={@JoinColumn(name=”tid”)}
)