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
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
- Hibernate注解整理笔记
- hibernate注解笔记
- Hibernate注解笔记
- hibernate笔记-003-使用注解
- Spring注解整合(hibernate+mybatis) 学习笔记
- java笔记--Hibernate中的注解(一)
- 基于注解的Hibernate配置(笔记)
- Hibernate二级缓存的注解(学习笔记)
- 整理笔记---Hibernate的Annotation(注解)
- hibernate学习笔记5 ------ 缓存,注解
- hibernate笔记-008-联合主键注解配置
- Java自学笔记之Hibernate-常用的hibernate注解
- hibernate 注解
- hibernate注解
- hibernate注解
- hibernate注解
- Hibernate注解
- Hibernate 注解
- mysql快速回忆
- netstat命令使用
- 第八周项目3-顺序串算法
- LINUX SQL随手
- 继续总结
- Hibernate注解笔记
- 第八周拓展实践(2)鸡兔同笼
- 4k hdr 显示传输方案调研
- 标记下关于保留小数的问题
- 并行计算—OpenMP—共享与私有
- 派生类和他的构造函数们
- pg查询表所拥有的子表
- R语言学习笔记(2)
- Leetcode刷题记——20. Valid Parentheses (有效的括号即括号匹配)