Hibernate 关系映射之一对一关联
Hibernate 最核心的功能是解决O/RMapping和事务处理。所以在此不得不论及Hibernate 关系映射
当然,这里说的映射其实是对象之间的关系,并不是指数据库的关系,因为Hibernate是对象化操作。
因为做项目的时候频繁使用了关系映射,在此过程中学习了尚学堂马士兵老师的Hibernate教程,结合自己的体会,和各位道友分享一下。
主要关系:
- 一对一
- 多对一
- 一对多
- 多对多
以上假如要细分的话下以层级还有单向关联、多向关联。
主要是这6种(一对多和多对一本质上没差),
当然还有集合映射,继承映射。不过暂时还用的少。
一、一对一单向关联映射
前提:两个对象之间是一对一的关系,如Person-IdCard(人—身份证号)
那么有两种策略可以实现一对一的关联映射
- 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。
- 唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系。
对象模型
实体类:
/** 人-实体类 */
public class Person { private int id; private String name; public int getId() {return id; } public void setId(int id) {this.id = id;} public String getName() {return name;} public void setName(Stringname) {this.name = name;} }
/**身份证-实体类*/
public class IdCard { private int id; private String cardNo; public int getId() {return id;} public void setId(int id) {this.id = id;} public String getCardNo(){ return cardNo;} public void setCardNo(StringcardNo) {this.cardNo = cardNo;} }
(一)唯一外键关联(单向)
1、对象模型
2、关系模型
3.1、实体映射关联(xml方式)
使用<many-to-one>标签关联,并使用unique="true"唯一性约束。
<hibernate-mapping> <class name="com.yk.hibernate.IdCard" table="id_card"> <id name="id" column="id"> <generator class="native"/> </id> <property name="cardNo" column="card_no"/> </class> </hibernate-mapping>
<hibernate-mapping> <class name="com.yk.hibernate.Person" table="person"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name"/> <!-- <many-to-one>:在多的一端 ,加入一个外键指向一的一端 ,但多对一关联映射字段可重复,所以需要加入一个唯一条件约束unique="true"--> <many-to-one name="idCard" column="card_id" unique="true"/> </class> </hibernate-mapping>
3.2、实体映射关联(annotation方式)
使用@OneToOne进行注解,来体现是一对一的关系
IdCard类
@Entity public class IdCard { private int id; private String cardNo; @Id @GeneratedValue public int getId() {return id;} public void setId(int id) {this.id = id;} public String getCardNo(){ return cardNo;} public void setCardNo(StringcardNo) {this.cardNo = cardNo;} }
Person类
@Entity public class Person { private int id; private String name; private IdCard idCard; //添加对象 @Id @GeneratedValue public int getId() {return id; } public void setId(int id) {this.id = id;} public String getName() {return name;} public void setName(Stringname) {this.name = name;} @OneToOne //表示一对一的关系 @JoinColumn(name="card_id") //为外键指定名称 public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } }
(二) 主键关联(单向)
1、对象模型
2、关系模型
3.1、主键单向关联(xml方式)
IdCard映射文件,先生成ID
<class name="com.yk.hibernate.IdCard" table="id_card"> <id name="id"column="id"> <generator class="native"/> </id> <property name="cardNo" column="card_no"/> </class>
Person实体类映射文件,ID是根据IdCard主键值,主键生成策略不能使用native或者identity了,而是 foreign
<class name="com.yk.hibernate.Person"table="person"> <id name="id"column="id"> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name"/> <one-to-one name="idCard"constrained="true"/> </class>
3.2、主键单向关联(annotation方式)
使用@OneToOne注解一对一关系,再使用@PrimaryKeyJoinColumn来注解主键关系映射。
Person类
@Entity
public class Person {
private int id;
private String name;
private IdCard idCard; //添加对象
@Id
public int getId() {return id; }
public void setId(int id) {this.id = id;}
public String getName() {return name;}
public void setName(Stringname) {this.name = name;}
@OneToOne //表示一对一的关系
@PrimaryKeyJoinColumn//注解主键关联映射
public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } }
二、一对一双向关联映射
上面的示例可以通过身份证idCard来找到相应的人Person,而反过来却不能查询。所以就有了一对一双向关联。
例如:夫妻关系就是一对一双向关联关系,通过丈夫可以找到妻子,通过妻子也可以找到丈夫。
(一)唯一外键关联(双向)
annotation方式:只需要在未加关联的注解mappedBy就ok了
@Entity public class Husband { private int id; private String name; private Wife wife; @Id @GeneratedValue public int getId() { return id; } public String getName() { return name; } @OneToOne @JoinColumn(name="wifeId") public Wife getWife() { return wife; } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } public void setWife(Wife wife) { this.wife = wife; } }
@Entity public class Wife { private int id; private String name; private Husband husband; @OneToOne(mappedBy="wife") public Husband getHusband() { return husband; } public void setHusband(Husband husband) { this.husband = husband; } @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
2、xml方式:使用<one-to-one>标签,并设置对应的关联类
<class name="com.yk.hibernate.Wife" table="wife"> <id name="id" column="id"> <generator class="native"/></id> <property name="name"/> <one-to-one name="husband" property-ref="Wife"/> </class>
相关推荐
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
Hibernate 一对一外键单向关联 Hibernate 一对一主键单向关联 Hibernate 一对一连接表单向关联 Hibernate 一对多外键单向关联 Hibernate 一对多连接表单向关联 Hibernate 多对一外键单向关联 Hibernate 多对一连接...
该资源包含了一些常用的hibernate关联映射实例。包括一对多,多对多,继承映射,等,是学习hibernate的必备品
Hibernate关联关系映射 单向关联 │ ├─ 一对一外键单向关联 │ ├─ 一对一主键单向关联 │ ├─ 一对一连接表单向关联 │ ├─ 一对多外键单向关联 │ ├─ 一对多连接表单向关联 │ ├─ 多对一外键单向关联 │ ...
关于对Hibernate关联映射的一个总结,其中有各种映射的例子,详细用法 等
Hibernate双向一对一关联映射(注解版)
Hibernate映射一对多关联关系
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
hibernate关联映射详解SSH 多对多,一对多关系对象映射
student与Score的Map集合关系 student与class的多对一 一对多映射
1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1:一对多和多对一映射,举例说明: 学生和老师: 一个老师可以教多个学生 【一对多映射】 多个学生可以被一个老师教【多对一映射】 部门与员工: ...
hibernate主键一对一关联映射代码示例
博文链接:https://shaqiang32.iteye.com/blog/201309
关于hibernate的关联操作 分享下
博文链接:https://shaqiang32.iteye.com/blog/201308
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
该资源包括了hibernate开发中的常见关联映射的源代码,其中包括:one2one,one2many,many2many等,还有继承映射,inverse,fetch,cascade关键字的应用等,对初学者来说,是很实用的,难度适中,很好理解
Hibernate 实体关联关系映射 学习总结 把一对一 一对多 单向 双向 主键 外键 链接表等讲的比较清楚
Hibernate双向一对一关联映射(XML版)