Hibernate注解笔记

来源:互联网 发布:提问软件 编辑:程序博客网 时间:2024/06/06 00:20
1.使用注解的目的:简化繁琐的ORM映射文件(*.hbm)的配置


2.JPA与Hibernate的关系


JPA:Java Persistence API:Java持久化API
JPA注解是JavaEE的规范和标准


JPA与Hibernate的关系:JPA是标准接口,Hibernate是实现,但是其功能是JPA的超集


Hibernate如何实现与JPA的关系:
通过Hibernate-annotation、Hibernate-entitymanager和Hibernate-core三个组件来实现。


一般在实际开发中,优先考虑使用JPA注解,这样更有利于程序的移植和扩展。


Hibernate注解分类:
类级别注解、属性级别注解、映射关系注解


类级别注解:
@Entity  映射实体类
@Entity(name="tableName")
name:可选,对应数据库中的一个表。若表名与实体类名相同,则可以省略。
注意:使用@Entity时必须指定实体类的主键属性




@Table(name="",catalog="",schema="")
通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息
name:可选,映射表的名称,默认表名和实体名称一致,只有在不一致的情况下才需要指定表名
catalog:表示目录。可选,表示Catalog名称,默认为Catalog("");
schema:表示模式。可选,表示Schema名称,默认为Schema("");




@Embeddedable
@Embeddedable表示一个非Entity类可以嵌入到另一个Entity类中作为属性而存在。
如果有多个属性定义为主键属性,该实体类必须实现Serializable接口。








属性级别注解:


添加方式:
一是写在属性字段上面
二是写在属性的get访问器上面


重点:@Id、@GeneratedValue、@Column、@Embedded、@EmbeddedId、@Transient、
@Version、@Basic、@SequenceGenerator、@Lob


@Id:
必须,定义了映射到数据库表的主键的属性,一个实体类可以有一个或者多个属性被映射为主键,可置于主键属性或者get()方法上。


@GeneratedValue(strategy=GenerationType,generator="")
有两个属性:
strategy:定义主键生成策略,取值有:
1.GenerationType.AUTO:根据底层数据库自动选择(默认)
2.GenerationType.INDENTIFY:使用数据库的Identity字段生成
3.GenerationType.SEQUENCE:使用Sequence来决定主键的取值
3.GenerationType.TABLE:使用指定表来决定主键取值,结合@TableGenerator使用




@Column
可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用。
常用属性:
name:可选,表示数据库表中该字段的名称,默认情形属性名称一致。
nullable:可选,是否允许为空,默认为true
unique:可选,是否为唯一标识,默认为false
length:可选,表示该字段的大小,仅对String类型的字段有效,默认255,(如果是主键,不能使用默认值)
issertable:可选,表示在ORM框架执行更新操作时,该字段是否应出现在INSERT语句中,默认为true
updateable:可选,表示在ORM框架执行更新操作时,该字段是否应出现在INSERT语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,例如对于birthday字段

@Embedded
@Embedded是注释属性的,表示该属性的类是嵌入类
注意:同时嵌入类也必须标注@Embedded注解


@EmbeddedId
@EmbeddedId使用嵌入式主键类实现复合主键
注意:嵌入式主键类必须实现Serializable接口、必须有默认的public无参的构造方法,必须覆盖


equals和hashCode方法.


@Transient
可选,表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,如果一个属性并非数据


库表的字段映射,就务必将其标示为@Transient,否则ORM框架默认将其注解为@Basic。



关系映射级别的注解
1.一对一单向外键

@OneToOne(cascade=CascadeType.ALL)
cascade:级联关系
@JoinColumn(name="pid",unique=true)
2.一对一双向外键关联
主控方的配置同一对一单向外键关联
@OneToOne(mappedBy="card")  //被控方
双向关联,必须设置mappedBy属性。因为双向关联只能交给一方去控制,不可能在双方都设置外键保存


关联关系,否则双方都无法保存


3.一对一单向外键联合主键
    1.创建主键类
    主键类必须实现Serializable接口,重写hashcode()和equals()方法。
    2.给主键类添加类注解@Embeddable,实体类的联合主键上添加@EmbeddedId


4.多对一单向外键关联
需要在多方添加两个注解:
@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
cascade指定级联关系  fetch表示抓取策略,EAGER表示渴望的,积极的
@JoinColumn(name="cid",referencedColumnName="CID")
表示多方持有一方的引用


5.一对多单向外键关联
需要在一方添加两个注解:
@OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY)
fetch表示抓取策略,LAZY表示懒加载
@JoinColumn(name="cid")


fetch设置:多对一的时候,多方设置EAGER,一方设置LAZY


6.一对多双向外键关联
多方:多方持有一方的引用
@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
@JoinColumn(name="cid",referencedColumnName="CID")
一方:一方持有多方的集合
@OneToMany(cascade={CascadeType.ALL},fetch=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 字段属性信息
@Embedded、@EmbeddedId  描述嵌入的属性
@Transient


3.映射关系注解
一对一单向外键:@OneToOne
一对一双向外键:@OneToOne(mappedBy="XXX")
一对一单向联合主键:@Embeddable  @EmbeddedId
多对一单向外键:@ManyToOne  @JoinColumn
一对多单向外键:@OneToMany  @JoinColumn
一对多双向外键:@ManyToOne  @OneToMany  @JoinColumn
多对多单向外键:@ManyToMany  @JoinTable
多对多双向外键:@ManyToMany(mappedBy="XXX")  @JoinTable
0 0