Hibernate之映射一对一关联
一.一对一关联的概念:
一对一之间的关联是指:两张表中的信息是一对一的关系,比如我们每个人和身份证的关系,一个人对应一张身份证,一张身份证也只能对应一个人。
Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射。
在下面的例子中我们分别以两张表:员工表和员工档案表为例:介绍这两种映射关系方式。
二.按外键映射
1.关联的外键可存放于任意一端,并在存放外键的一端增加<many-to-one>元素,能够增加唯一约束实现一对一关联。
2.<many-to-one>元素的unique="true"属性,表示1-1关联;name属性指定关联属性的属性名
3.另一端需要使用<one-to-one>元素,在元素中使用"property-ref"属性(可不加),指定使用被关联实体主键以外的字段作为关联字段。
I.首先建立两张表的实体类:
Users1:
package cn.entity; /** * 员工账号实体类 * @author hyj * */ public class Users1 { private Integer userid;//员工账号 private String username;//员工名称 private String userpass;//员工密码 private Resume1 resume1;//员工的档案 public Users1() { super(); // TODO Auto-generated constructor stub } public Users1(String username, String userpass) { super(); this.username = username; this.userpass = userpass; } public Users1(Integer userid, String username, String userpass, Resume1 resume1) { super(); this.userid = userid; this.username = username; this.userpass = userpass; this.resume1 = resume1; } public Integer getUserid() { return userid; } public void setUserid(Integer userid) { this.userid = userid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getUserpass() { return userpass; } public void setUserpass(String userpass) { this.userpass = userpass; } public Resume1 getResume1() { return resume1; } public void setResume1(Resume1 resume1) { this.resume1 = resume1; } }
Resume1:
package cn.entity; /** * 员工档案实体类 * @author hyj * */ public class Resume1 { private Integer resid; private String resname;//档案名称 private String rescardno;//档案编号 private Users1 users1;//所属员工 public Resume1() { super(); // TODO Auto-generated constructor stub } public Resume1(Integer resid, String resname, String rescardno, Users1 users1) { super(); this.resid = resid; this.resname = resname; this.rescardno = rescardno; this.users1 = users1; } public Resume1(String resname, String rescardno) { super(); this.resname = resname; this.rescardno = rescardno; } public Integer getResid() { return resid; } public void setResid(Integer resid) { this.resid = resid; } public String getResname() { return resname; } public void setResname(String resname) { this.resname = resname; } public String getRescardno() { return rescardno; } public void setRescardno(String rescardno) { this.rescardno = rescardno; } public Users1 getUsers1() { return users1; } public void setUsers1(Users1 users1) { this.users1 = users1; } }
II.建立两个实体类的映射文件:
Resume1.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.entity"> <class name="Resume1" table="Resume1"> <id name="resid" column="resid"> <generator class="native"></generator> </id> <property name="resname" column="resname" type="string"></property> <property name="rescardno" column="rescardno" type="string"></property> <many-to-one name="users1" class="Users1" column="RESUSERID" cascade="all" unique="true"></many-to-one> </class> </hibernate-mapping>
Users1.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.entity"> <class name="Users1" table="Users1"> <id name="userid" column="USERID"> <generator class="native"></generator> </id> <property name="username" column="username" type="string"></property> <property name="userpass" column="userpass" type="string"></property> <one-to-one name="resume1" class="Resume1" property-ref="users1"></one-to-one> </class> </hibernate-mapping>
III:建立测试类:
package cn.test; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import cn.entity.Resume1; import cn.entity.Users1; import cn.util.HibernateUtil; public class HappyTest { /** * 添加信息 */ @Test public void addInfoTest(){ //1.获取session对象 Session session=HibernateUtil.currentSession(); //2.开启事务 Transaction tx = session.beginTransaction(); //3.准备一个用户对象 Users1 users1=new Users1("hyj","123"); //4.创建一个档案对象 Resume1 resume1=new Resume1("高级机密档案","hyj0819"); //5.让用户归属档案,档案归属用户 users1.setResume1(resume1); resume1.setUsers1(users1); //6.session.save保存档案即可,应为cascade的属性值为all,保存档案的同时自动保存用户 session.save(resume1); //7.提交事务 tx.commit(); //8.关闭session HibernateUtil.closeSession(); System.out.println("添加成功"); } /** * 查询员工档案的时候同时加载用户信息 */ @Test public void selectInfoTest(){ //1.获取session对象 Session session=HibernateUtil.currentSession(); //2.获取员工档案对象 Resume1 resume1=(Resume1)session.load(Resume1.class, 1); //3.根据员工档案获取用户的信息 Users1 users1= resume1.getUsers1(); //4.输出结果 System.out.println("档案名称:"+resume1.getResname()); System.out.println("用户姓名:"+users1.getUsername()); //8.关闭session HibernateUtil.closeSession(); } }
user1表:
resume1表:
三.按主键映射
1.关联要求两个对象的主键必须保持一致,通过两个表的主键建立关联关系须外键参与。
2.基于主键的映射策略:指一端的主键生成器使用"class="foreign""策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键。<param>子元素指定使用当前持久化类的哪个属性作为"对方"。
3.采用foreign主键生成器策略的一端增加<one-to-one>元素映射关联属性,并在<one-to-one>元素中增加constrained="true"属性;另一端也增加<one-to-one>元素映射关联属性。
4."constrained="true""属性:指定当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象("对方")所对应的数据库表主键
I.首先建立两张表的实体类:
为了区分案例此表为Users2 Resume2:
Users2:
package cn.entity; /** * 员工账号实体类 * @author hyj * */ public class Users2 { private Integer userid; private String username; private String userpass; private Resume2 resume2; public Users2() { super(); // TODO Auto-generated constructor stub } public Users2(Integer userid, String username, String userpass, Resume2 resume2) { super(); this.userid = userid; this.username = username; this.userpass = userpass; this.resume2 = resume2; } public Integer getUserid() { return userid; } public void setUserid(Integer userid) { this.userid = userid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getUserpass() { return userpass; } public void setUserpass(String userpass) { this.userpass = userpass; } public Resume2 getResume2() { return resume2; } public void setResume2(Resume2 resume2) { this.resume2 = resume2; } public Users2(String username, String userpass) { super(); this.username = username; this.userpass = userpass; } }
Resume2:
package cn.entity; /** * 员工档案实体类 * @author hyj * */ public class Resume2 { private Integer resid; private String resname; private String rescardno; private Users2 users2; public Resume2() { super(); // TODO Auto-generated constructor stub } public Resume2(Integer resid, String resname, String rescardno, Users2 users2) { super(); this.resid = resid; this.resname = resname; this.rescardno = rescardno; this.users2 = users2; } public Resume2(String resname, String rescardno) { super(); this.resname = resname; this.rescardno = rescardno; } public Integer getResid() { return resid; } public void setResid(Integer resid) { this.resid = resid; } public String getResname() { return resname; } public void setResname(String resname) { this.resname = resname; } public String getRescardno() { return rescardno; } public void setRescardno(String rescardno) { this.rescardno = rescardno; } public Users2 getUsers2() { return users2; } public void setUsers2(Users2 users2) { this.users2 = users2; } }
II.建立两个实体类的映射文件:
Resume2.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.entity"> <class name="Resume2" table="Resume2"> <id name="resid" column="resid"> <generator class="native"></generator> </id> <property name="resname" column="resname" type="string"></property> <property name="rescardno" column="rescardno" type="string"></property> <one-to-one name="users2" cascade="all" class="Users2"/> </class> </hibernate-mapping>
Users2.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.entity"> <class name="Users2" table="Users2"> <id name="userid" column="USERID" > <generator class="foreign"> <param name="property">resume2</param> </generator> </id> <property name="username" column="username" type="string"></property> <property name="userpass" column="userpass" type="string"></property> <one-to-one name="resume2" class="Resume2" constrained="true"></one-to-one> </class> </hibernate-mapping>
III.建立测试类:
package cn.test; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import cn.entity.Resume2; import cn.entity.Users2; import cn.util.HibernateUtil; public class HappyTest { /** * 添加信息 */ @Test public void addInfoTest(){ //1.获取session对象 Session session=HibernateUtil.currentSession(); //2.开启事务 Transaction tx = session.beginTransaction(); //3.准备一个用户对象 Users2 users2=new Users2("hyj","123"); //4.创建一个档案对象 Resume2 resume2=new Resume2("高级机密档案","hyj0819"); //5.让用户归属档案,档案归属用户 users2.setResume2(resume2); resume2.setUsers2(users2); //6.session.save保存档案即可,应为cascade的属性值为all,保存档案的同时自动保存用户 session.save(resume2); //7.提交事务 tx.commit(); //8.关闭session HibernateUtil.closeSession(); System.out.println("添加成功"); } /** * 查询员工档案的时候同时加载用户信息 */ @Test public void selectInfoTest(){ //1.获取session对象 Session session=HibernateUtil.currentSession(); //2.获取员工档案对象 Resume2 resume2=(Resume2)session.load(Resume2.class, 3); //3.根据员工档案获取用户的信息 Users2 users2= resume2.getUsers2(); //4.输出结果 System.out.println("档案名称:"+resume2.getResname()); System.out.println("用户姓名:"+users2.getUsername()); //8.关闭session HibernateUtil.closeSession(); } }
users2表
resume2表
Hibernate之映射一对一关联的更多相关文章
- Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射
Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...
- Hibernate 性能优化一对一关联映射
概述: hibernate提供了两种映射一对一关联的方式:按照外键映射和按照主键映射. 下面以员工账号和员工档案为例 ,介绍两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1)保存员工档 ...
- Hibernate中的一对一关联和组件的映射
Hibernate提供了两种映射一对一映射关联关系的方式: 01.按照外键映射 02.按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这 ...
- Hibernate中的一对一关联
Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...
- Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式 双向关联和单向关联的区别
首先还是来构造一个实际应用的场景,比如实体类车辆(Car),它具有以下属性:Id,品牌(brand),车牌(lisencePlate):实体类车牌(LisencePlate),它具有以下属性:Id,号 ...
- Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式
首先还是来构造一个实际应用的场景,比如实体类车辆(Car),它具有以下属性:Id,品牌(brand),车牌(lisencePlate):实体类车牌(LisencePlate),它具有以下属性:Id,号 ...
- Hibernate中一对一关联映射/组件映射
Hibernate映射:一对一关联 1.按照外键映射 2.按照主键映射 组件映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别 ...
- Hibernate映射一对一关联关系
映射一对一关联 Hibernate提供了两种映射一对一关联关系的方式,分别是按照外键映射和按照主键映射. 下面是员工表和档案信息表(员工和档案表之间的关系是一对一的关系) 档案表(dept) pub ...
- 04.Hibernate一对一关联
前言:本文主要介绍使用Hibernate映射一对一的关联关系的两种方式:使用外键映射.使用主键映射. 1.数据库表的一对一关联关系 本文根据客户信息表(tb_customer)和地址信 ...
随机推荐
- python中%和format
两者都是格式化字符串用的,前者是比较老的版本,现在已经不推荐,后者更强大一些 % In [22]: print '%s' % 'hello world' hello world In [23]: pr ...
- ffmpeg]ffmpeg使用参数的中文说明
基本选项: -formats 输出所有可用格式 -f fmt 指定格式(音频或视频格式) -i filename 指定输入文件名,在linux下当然也能指定:0.0(屏幕录制)或摄像头 -y 覆盖已有 ...
- Alpha版本十天冲刺——Day 7
站立式会议 祝曹鑫杰和常松童鞋生日快乐!短短几天冲刺,就迎来了三位队员的生日,希望也给我们的Alpha版本带来好运,加油! 会议总结 队员 今天完成 遇到的问题 明天要做 感想 鲍亮 上传图片接口 无 ...
- linux快速安装lamp环境
我折腾过不少的lamp安装方式,lnmp也折腾过.不过因为windows下面apache用的比较多,各种配置也比较熟悉,因此最终还是选择了lamp这个架构. 由于是自己装虚拟机玩,所以各种安全措施都没 ...
- java的对象的总结:(PO,VO,DAO,BO,POJO)
一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对数 ...
- 深入剖析z-index属性
一.z-index七阶层叠顺序表 1.层叠顺序的大小比较: background/border < 负z-index < block块状水平盒子 < float浮动盒子 < i ...
- WinForm------TreeList实现鼠标经过节点背景色改变
转载: http://www.cnblogs.com/zfanlong1314/archive/2012/06/26/2564124.html
- winform的tab跳到下一个
先设置TabStop=true,再设置TabIndex的顺序
- Spring MVC学习笔记——注解式控制器
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【六】——实现资源间的关联
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 这一篇文章主要介绍一下资源间的关联——例如在学生和课程之间就存在这样的关联:每一个课程都会有 ...