一对一关联指两个表之间的记录是一一对应的关系。分为两种:外键关联主键关联

(1)外键关联

比如一家公司(Company)和它所在的地址(Address)。在业务逻辑中要求一家公司只有唯一的地址,一个地址也只有一家公司。下图表现为外键关联关系

对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one
元素。为many-to-one元素增加unique=“true”属性来表示为1-1关联,并用name属性来指定关联属性的属性名
另一端需要使用one-to-one元素,该元素使用property-ref(可以不加)属性指定使用被关联实体主键以外的字段作为关联字段

示例代码:

Company.java  bean对象

public class Company implements java.io.Serializable {
private Integer id;
private String name; //一家公司对应一个地址
private Address address; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Address getAddress() {
return address;
} public void setAddress(Address address) {
this.address = address;
}
}

Address.java

public class Address implements java.io.Serializable{
private Integer id;
private String city;
private String country; //一个地址含有一家公司
private Company company; public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
}

Company.hbm.xml 映射配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.one2onefk.Company" table="companyfk">
<id name="id" type="integer">
<column name="id"/>
<generator class="increment"/>
</id>
<property name="name" type="string">
<column name="name"/>
</property> <!-- 一对一外键关联
many-to-one:使用many-to-one
unique="true":设置companyfk表的外键唯一 addressid integer unique,
-->
<many-to-one name="address" column="addressid" unique="true"/>
</class>
</hibernate-mapping>

Address.hbm.xml 映射配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.one2onefk.Address" table="addressfk">
<id name="id" type="integer">
<column name="id"/>
<generator class="increment"/>
</id>
<property name="city" type="string">
<column name="city"/>
</property> <property name="country" type="string">
<column name="country"/>
</property> <!-- 映射一对一
property-ref(互相引用):company属性管理的address这个属性
property-ref的值为Company这个类中的address属性(可以不加)
-->
<one-to-one name="company" property-ref="address"/> </class>
</hibernate-mapping>

App.java 测试代码

public class App {
private static SessionFactory sf=null; static{
Configuration config=new Configuration();
config.configure("cn/itcast/one2onefk/hibernate.cfg.xml");
config.addClass(Company.class);
config.addClass(Address.class);
sf=config.buildSessionFactory();
} /*
* 知识点1:测试保存
*/
@Test
public void saveCompanyAndAddress(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); Company c=new Company();
c.setName("长城"); Address address=new Address();
address.setCity("上海");
address.setCountry("中国"); //建立关联
c.setAddress(address);
address.setCompany(c); //保存
session.save(address);
session.save(c); tx.commit();
session.close();
} //知识点2:测试唯一性
@Test
public void testUnique(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); Company c=new Company();
c.setName("天空网"); //获取一号地址
Address address=(Address)session.get(Address.class, 1); //建立关联
c.setAddress(address);
address.setCompany(c); //不能保存
session.save(c); tx.commit();
session.close();
}
}

(2)主键关联

一对一的另一种解决方式就是主键关联,在这种关联关系中,要求两个对象的主键必须保持一致,一方既是主键又是外键,通过两个表的主键建立关联关系,无须外键参与。

基于主键的映射策略:指一端的主键生成器使用
foreign 策略,表明根据”对方”的主键来生成自己的主键,自己并不能独立生成主键.
<param> 子元素指定使用当前持久化类的哪个属性作为 “对方”
采用foreign主键生成器策略的一端增加
one-to-one 元素映射关联属性,其
one-to-one 属性还应增加
constrained=“true”属性;另一端(company)增加one-to-one元素映射关联属性。
constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象(“对方”)所对应的数据库表主键
 
示例代码, java bean类 和 测试代码与(1)中一样, 不同的只有映射配置文件。
Address.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.one2onepk.Address" table="addresspk">
<id name="id" type="integer">
<column name="id"/>
<!--
foreign:表示addresspk表的主键的生成参照另一个表(companypk的)主键
这里addresspk表的主键值来源于companypk表的主键,不是该addresspk表自己生成
-->
<generator class="foreign">
<!--
property:该Address类对应表主键的生成,参照该类中的属性company
-->
<param name="property">company</param>
</generator> </id>
<property name="city" type="string">
<column name="city"/>
</property> <property name="country" type="string">
<column name="country"/>
</property> <!--one-to-one配置Address和Company的一对一关联
constrained="true":为addresspk增加外键约束
-->
<one-to-one name="company" constrained="true"/> </class>
</hibernate-mapping>

Company.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.one2onepk.Company" table="companypk">
<id name="id" type="integer">
<column name="id"/>
<generator class="increment"/>
</id>
<property name="name" type="string">
<column name="name"/>
</property> <!-- 配置Company和地址的一对一关联 -->
<one-to-one name="address"/> </class>
</hibernate-mapping>

Hibernate -- 一对一映射的更多相关文章

  1. Hibernate一对一映射关联

    Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...

  2. java框架篇---hibernate(一对一)映射关系

    对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,本质上就是将数据从 ...

  3. hibernate一对一映射

    package loaderman.c_one2one; // 身份证 public class IdCard { // 身份证号(主键) private String cardNum;// 对象唯一 ...

  4. .Hibernate一对一映射与组件映射

    1.按照外键映射(Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射) 实现需要: 创建实体类Users1和Resume1 public class Users1 { p ...

  5. Hibernate 一对一映射(惟一外键)

  6. Hibernate 一对一映射(共享主键)

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

    上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ...

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

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

  9. Hibernate一对一关系映射

    Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...

随机推荐

  1. Less-css基础扩展

    //扩展Extend less的伪类,合并了选择器,放在与它引用匹配的选择器上 Use Method:以在study上扩展test的样式为例 .test{ color:#000000; font-si ...

  2. Windows Server 2008及以上系统磁盘无法查看(About UAC and ACE)

    在windows Server2008及以上系統,如果UAC Enabled,ACE列表中不會包含Administrators成員的SID,所以即使你是administrators的成員,也無法訪問D ...

  3. Drupal 8 提供REST服务实例

    drupal8 的核心模块已经支持REST服务. 这样的话使用drupal 对外提供web service 变的简单了. 测试一下d8 的webservice : extend 中的 依赖模块:全部启 ...

  4. Spring MVC 根据请求方法限定:请求方法(四)

    请求方法 说明 GET 使用GET方法检索一个表述(representation)——也就是对资源的描述.多次执行同一GET请求,不会对系统造成影响,GET方法具有幂等性[指多个相同请求返回相同的结果 ...

  5. XML 之快速入门

    XML 简介 - XML, 即可扩展标记语言(eXtensible Markup Language), 是一种标记语言. - 标记型语言: 使用标签进行操作 - 可扩展: XML 的标签可以自定义 - ...

  6. 转+总结!! 关于jsp页面取值方式

    1.      前台往后台传值,通过提交表单,在后台有set,get方法,可以直接取到.如果通过request.getParameter(paramName) 去获取通过会报空指针异常. 其中requ ...

  7. Matlab/Simulink仿真中如何将Scope转化为Figure?

    1.只需要在运行仿真后,在命令窗口内输入: ,'ShowHiddenHandle','on'); set(gcf,'menubar','figure'); scope最上方会出现一个菜单栏,选择Too ...

  8. 怎么理解TCP的面向连接和UDP的无连接(不面向连接)?

    TCP关心分组是否准确送达,甚至仔细到给每个分组编号并收到目的端的确认“我已经收到啦~你继续发~”才继续发送后续的分组,而UDP则不然,它只负责把分组封装好后直接发送到链路上,至于目的端收到与否并不关 ...

  9. 关于 ActionBar、ToolBar、StatusBar 的开发经验整理

    一.ActionBar.ToolBar概述 1.1 ActionBar 1.2 ToolBar 1.3 StatusBar StatusBar 是一个半透明阴影,View 可以伸展到其后面. 1.4 ...

  10. python网络编程——网络IO模型

    1 网络IO模型介绍 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:    (1)同步阻塞IO(Blocking IO):即传统的IO模型.    (2)同步非阻塞IO(Non-bl ...