Hibernate之基于外键映射的一对一(1-1)关联关系
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>
<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)关联关系的更多相关文章
- java之hibernate之基于外键的双向一对一关联映射
这篇讲解 基于外键的双向一对一关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 2.类结构 Person.java public class Person implements ...
- Hibernate 基于外键映射的一对一关联关系随手记
//有外键的一端默认使用懒加载. //没有外键的一端不使用懒加载,而是直接将它引用的对象也一并查询出来. //没有外键列不仅有外键约束还有唯一约束,即没有外键列一端的对象不能被有外键列一端的两个对象同 ...
- Hibernate之基于主键映射的一对一关联关系
1. 基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键.并用<param> 子元素指定使用当 ...
- hibernate笔记--基于外键的单(双)向的一对一映射关系
假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...
- Hibernate关系映射(二) 基于外键的双向一对一
基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 ...
- Hibernate学习(二补充)关系映射----基于外键的双向一对一
刚刚写的是基于外键的单向一对一. 那么双向一对一就是在单向一对一的基础上稍微改动就可以了. account.java和account.hbm.xml都不用变动 只要我们小小的变动address.j ...
- Hibernate 基于外键的双向一对一关联映射
之前简单介绍了基于外键的单项一对一的关联映射关系,本文简单介绍基于外键的双向一对一的关联映射. 1.设计表结构 表结构对于双向一对一来说没有多少改变,只是双向都可以获取到对方. 2.创建Person对 ...
- Hibernate(八):基于外键映射的1-1关联关系
背景: 一个部门只有一个一把手,这在程序开发中就会设计数据映射应该设置为一对一关联. 在hibernate代码开发中,实现这个业务有两种方案: 1)基于外键映射的1-1关联: 2)基于主键映射的1-1 ...
- hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同
基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化 ...
随机推荐
- SVN update: 'skipped' message
在eclipse中用svn插件同步google code老是服务器连接time out!就只有通过检出项目再更新啦,结果遇到个SVN update: 'skipped' message问题,还是sta ...
- JVM学习笔记(三)------内存管理和垃圾回收
JVM内存组成结构 JVM栈由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)堆 所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制.堆被划分为新生代和旧生 ...
- tomcat发布web service教程
这几天一直在准备找工作,自学了关于web service的一些基本的内容,也遇到了不少问题.现在就把我自己学到的知识和大家分享一下,由于是初学,所以有什么错误的地方请大家帮忙指正,感激不尽~~!! 1 ...
- bzoj3926
题目的意思是叶子不超过20个……听说当初zjoi不少人被坑 分别对每个叶子以它为根dfs出20个dfs树,这样整个树的任何一个子串,都是某个dfs树上一个点到它的一个子孙的路径 每个dfs树,根到叶子 ...
- UVa 557 (概率 递推) Burger
题意: 有两种汉堡给2n个孩子吃,每个孩子在吃之前要抛硬币决定吃哪一种汉堡.如果只剩一种汉堡,就不用抛硬币了. 求最后两个孩子吃到同一种汉堡的概率. 分析: 可以从反面思考,求最后两个孩子吃到不同汉堡 ...
- datatables 参数详解(转)
//@translator codepiano //@blog codepiano //@email codepiano.li@gmail.com //尝试着翻译了一下,难免有错误的地方,欢迎发邮件告 ...
- apache开源项目--subversion
Subversion exists to be universally recognized and adopted as an open-source, centralized version co ...
- Python interview preparing
Collection & Recommended: 1. CN - 论坛中看到. - EN 英文原文真的真的很好好好T_T,看得让人感动T_T 总结个人感兴趣的问题(以下部分参照上面): 1. ...
- 06day1
Rabbit Number 枚举 [问题描述] 设 S(N)表示 N 的各位数字之和,如 S(484)=4+8+4=16,S(22)=2+2=4.如果一个正整数 x满足 S(x*x)=S(x)*S(x ...
- FFmpeg解码H264及swscale缩放详解
本文概要: 本文介绍著名开源音视频编解码库ffmpeg如何解码h264码流,比较详细阐述了其h264码流输入过程,解码原理,解码过程.同时,大部分应用环境下,以原始码流视频大小展示并不是最佳方式,因此 ...