1.对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素。为many-to-one元素增加unique=“true”属性来表示为1-1关联

<many-to-one name="mgr" class="com.elgin.hibernate.one2one.foreign.Manager">
<column name="MGRID" unique="true"></column>
</many-to-one>
2.另一端需要使用one-to-one元素,该元素使用property-ref属性指定使用被关联实体主键以外的字段作为关联字段
<one-to-one name="dept" class="com.elgin.hibernate.one2one.foreign.Department"
property-ref="mgr"></one-to-one>

未使用property-ref属性的SQL:

Hibernate:
select
manager0_.MGRID as MGRID1_1_1_,
manager0_.MGRNAME as MGRNAME2_1_1_,
department1_.DEPTID as DEPTID1_0_0_,
department1_.DEPTNAME as DEPTNAME2_0_0_,
department1_.MGRID as MGRID3_0_0_
from
MANAGER manager0_
left outer join
DEPARTMENT department1_
on manager0_.MGRID=department1_.DEPTID
where
manager0_.MGRID=?

使用property-ref属性的SQL:

Hibernate:
select
manager0_.MGRID as MGRID1_1_1_,
manager0_.MGRNAME as MGRNAME2_1_1_,
department1_.DEPTID as DEPTID1_0_0_,
department1_.DEPTNAME as DEPTNAME2_0_0_,
department1_.MGRID as MGRID3_0_0_
from
MANAGER manager0_
left outer join
DEPARTMENT department1_
on manager0_.MGRID=department1_.MGRID
where
manager0_.MGRID=?

从上面2个查询时发出的sql语句可以看出,如果不使用property-ref属性,那么关联department的左外链接关联条件会错误!

测试代码:

Manager.java类:

package com.elgin.hibernate.one2one.foreign;

public class Manager {

	private int mgrId;
private String mgrName;
private Department dept;
public int getMgrId() {
return mgrId;
}
public void setMgrId(int mgrId) {
this.mgrId = mgrId;
}
public String getMgrName() {
return mgrName;
}
public void setMgrName(String mgrName) {
this.mgrName = mgrName;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
} }

Department.java类

package com.elgin.hibernate.one2one.foreign;

public class Department {

	private int deptId;
private String deptname;
private Manager mgr; public int getDeptId() {
return deptId;
}
public void setDeptId(int deptId) {
this.deptId = deptId;
}
public String getDeptname() {
return deptname;
}
public void setDeptname(String deptname) {
this.deptname = deptname;
}
public Manager getMgr() {
return mgr;
}
public void setMgr(Manager mgr) {
this.mgr = mgr;
}
}

2个实体类对应的hibernate映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-9-25 22:25:22 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.elgin.hibernate.one2one.foreign.Manager" table="MANAGER">
<id name="mgrId" type="int">
<column name="MGRID" />
<generator class="native" />
</id>
<property name="mgrName" type="java.lang.String">
<column name="MGRNAME" />
</property>
<!-- 映射1对1关联关系:对应的数据表中(此处为department)如果已经有外键,当前持久化类使用one-to-one 进行映射 -->
<!--
没有外键的一端需要使用one-to-one元素,该元素的property-ref属性指定使用被关联的实体主键以外的字段作为关联字段
-->
<one-to-one name="dept" class="com.elgin.hibernate.one2one.foreign.Department"
property-ref="mgr"></one-to-one>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-9-25 22:25:22 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.elgin.hibernate.one2one.foreign.Department" table="DEPARTMENT">
<id name="deptId" type="int">
<column name="DEPTID" />
<generator class="native" />
</id>
<property name="deptname" type="java.lang.String">
<column name="DEPTNAME" />
</property>
<!-- 使用 many-to-one 的方式来映射1-1关联关系 -->
<many-to-one name="mgr" class="com.elgin.hibernate.one2one.foreign.Manager">
<column name="MGRID" unique="true"></column>
</many-to-one>
</class>
</hibernate-mapping>

Junit测试类:

package com.elgin.hibernate.one2one.foreign;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; public class HibernateTest2 { //如此声明只为方便测试,生产环境不能这么用
private SessionFactory sessionFactory;
private Session session;
private Transaction transcation; @Before
public void init(){
Configuration cfg=new Configuration().configure();
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
sessionFactory=cfg.buildSessionFactory(serviceRegistry);
session=sessionFactory.openSession();
transcation=session.beginTransaction();
} @Test
public void testOne2OneForeignSave(){
Manager mgr=new Manager();
mgr.setMgrName("XXX"); Department dept=new Department();
dept.setDeptname("软件开发部"); dept.setMgr(mgr);
mgr.setDept(dept);
//建议先保存没有外键的一端,这样可以少发送一条update语句
session.save(mgr);
session.save(dept);
} @Test
public void testOne2OneForeignGet(){
//1.依旧使用懒加载,默认情况下不直接查询出关联的对象,而是返回对应的代理对象,等到使用的时候再来初始化
//2.所以在session关闭的情况下仍旧会出现懒加载异常
// Department dept=(Department) session.get(Department.class, 1);
// System.out.println(dept.getDeptname()); //3.查询Manager对象的左外连接条件应该是dept.manager_id=mgr.manager_id
// 而不应该是dept.dept_id=mgr.manager_id
//4.在查询没有外键的实体对象时使用左外连接一并查询出其关联的对象并初始化
Manager mgr=(Manager) session.get(Manager.class, 1);
System.out.println(mgr.getMgrName());
} @After
public void destory(){
transcation.commit();
session.close();
sessionFactory.close();
} }

基于外键的映射的1-1关联关系中,要点:

1.有外键的一端,使用many-to-one元素进行映射,并且增加unique属性,保证外键的唯一性

2.没有外键的一端,使用one-to-one元素映射,并且要指定property-ref属性

Hibernate之基于外键映射的一对一(1-1)关联关系的更多相关文章

  1. java之hibernate之基于外键的双向一对一关联映射

    这篇讲解 基于外键的双向一对一关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 2.类结构 Person.java public class Person implements ...

  2. Hibernate 基于外键映射的一对一关联关系随手记

    //有外键的一端默认使用懒加载. //没有外键的一端不使用懒加载,而是直接将它引用的对象也一并查询出来. //没有外键列不仅有外键约束还有唯一约束,即没有外键列一端的对象不能被有外键列一端的两个对象同 ...

  3. Hibernate之基于主键映射的一对一关联关系

    1. 基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键.并用<param> 子元素指定使用当 ...

  4. hibernate笔记--基于外键的单(双)向的一对一映射关系

    假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...

  5. Hibernate关系映射(二) 基于外键的双向一对一

    基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 ...

  6. Hibernate学习(二补充)关系映射----基于外键的双向一对一

    刚刚写的是基于外键的单向一对一.  那么双向一对一就是在单向一对一的基础上稍微改动就可以了. account.java和account.hbm.xml都不用变动  只要我们小小的变动address.j ...

  7. Hibernate 基于外键的双向一对一关联映射

    之前简单介绍了基于外键的单项一对一的关联映射关系,本文简单介绍基于外键的双向一对一的关联映射. 1.设计表结构 表结构对于双向一对一来说没有多少改变,只是双向都可以获取到对方. 2.创建Person对 ...

  8. Hibernate(八):基于外键映射的1-1关联关系

    背景: 一个部门只有一个一把手,这在程序开发中就会设计数据映射应该设置为一对一关联. 在hibernate代码开发中,实现这个业务有两种方案: 1)基于外键映射的1-1关联: 2)基于主键映射的1-1 ...

  9. hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

    基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化 ...

随机推荐

  1. MyEclipse开发WebService教程

    . 创建一个 webService 工程. 2. 创建一个普通 Java 类   3. 创建 webService 服务端 HelloJaxwsDelegate.java 的源代码如下:   4. 导 ...

  2. Oracle过程包加密

    Oracle加绕功能可以将PL/SQL代码实现部分隐藏,如存储过程.函数.包体等均可使用加绕功能,下面以一个存储过程实现部分加绕来展示Oracle加绕功能的使用.  加绕方法一: 1.编写如下存储过程 ...

  3. 面试题_1_to_16_多线程、并发及线程的基础问题

    多线程.并发及线程的基础问题 1)Java 中能创建 volatile 数组吗?能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引 ...

  4. 用imagemagick和tesseract-ocr破解简单验证码

    用imagemagick和tesseract-ocr破解简单验证码 Tesseract-ocr据说辨识程度是世界排名第三,可谓神器啊. 准备工作: 1.安装tesseract-ocr sudo apt ...

  5. perl基本语法

    标量 标量是 Perl 中最简单的数据类型.大多数的标量是数字(如 255 或 3.25e20)或者字符串(如 hello或者盖茨堡地址). 数字 perl中所有数字内部的格式都是双精度浮点数. 浮点 ...

  6. How to modify squashfs image

    /********************************************************************** * How to modify squashfs ima ...

  7. 从投影的角度理解pca:向量,投影,基,内积,坐标,维数,分散程度,方差,协方差矩阵,对角化,特征值分解,主成分分析PCA

    参考:http://blog.csdn.net/songzitea/article/details/18219237

  8. 【jQuery】总结:筛选器、控制隐藏、操作元素style属性

    筛选器 -> http://blog.csdn.net/lijinwei112/article/details/6938134 常用到的: $("tr[id=ac_"+id+ ...

  9. 【转】iOS学习之Autolayout(代码添加约束) -- 不错不错

    原文网址:http://www.cnblogs.com/HypeCheng/articles/4192154.html DECEMBER 07, 2013 学习资料 文章 Beginning Auto ...

  10. Oracle RAC OCR 的备份与恢复

    Oracle Clusterware把整个集群的配置信息放在共享存储上,这些信息包括了集群节点的列表.集群数据库实例到节点的映射以及CRS应用程序资源信息.也即是存放在ocr 磁盘(或者ocfs文件) ...