一对一主键关联不需要额外的表字段;如果两行是通过这种一对一关系相关联的,那么这两行就共享同样的主关键字值。所以如果你希望两个对象通过主键一对一关联,你必须确认它们被赋予同样的标识值!
比如说,对下面的Employee和Person进行主键一对一关联:
<one-to-one name="person" class="Person"/>
<one-to-one name="employee" class="Employee" constrained="true"/>
现在我们必须确保PERSON和EMPLOYEE中相关的字段是相等的。我们使用一个被成为foreign的特殊的hibernate标识符生成策略:
<class name="person" table="PERSON"> <id name="id" column="PERSON_ID"> <generator class="foreign"> <param name="property">employee</param> </generator> </id> ... <one-to-one name="employee" class="Employee" constrained="true"/> </class>
一个刚刚保存的Person实例被赋予和该Person的employee属性所指向的Employee实例同样的关键字值。
下面是居民与身份证的例子:
居民Person类
package org.hibernate.domain; public class Person { private int id; private String name; private IdCard idCard; 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; } public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } }
身份证IdCard类:
package org.hibernate.domain; public class IdCard { private int id; private Person person; public int getId() { return id; } public void setId(int id) { this.id = id; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }
映射文件:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.hibernate.domain"> <class name="Person" table="person"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <one-to-one name="idCard" /> </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"> <hibernate-mapping package="org.hibernate.domain"> <class name="IdCard" table="idCard"> <id name="id"> <generator class="foreign"> <param name="property">person</param> </generator> </id> <one-to-one name="person" constrained="true" /> </class> </hibernate-mapping>
测试类:
package org.hibernate.test; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.domain.IdCard; import org.hibernate.domain.Person; import org.hibernate.util.HibernateUtil; public class OneToOne { public static void main(String[] args) { Person person = add(); person = queryPerson(person.getId()); queryIdCard(person.getIdCard().getId()); } public static Person add() { Session session = null; Transaction tx = null; try { session = HibernateUtil.getSession(); IdCard idCard = new IdCard(); Person person = new Person(); person.setName("new person"); person.setIdCard(idCard); idCard.setPerson(person); tx = session.beginTransaction(); session.save(person); session.save(idCard); tx.commit(); return person; } finally { if (session != null) session.close(); } } public static Person queryPerson(int id) { Session session = null; Transaction tx = null; try { session = HibernateUtil.getSession(); tx = session.beginTransaction(); Person person = (Person) session.get(Person.class, id); tx.commit(); return person; } finally { if (session != null) session.close(); } } public static IdCard queryIdCard(int id) { Session session = null; Transaction tx = null; try { session = HibernateUtil.getSession(); tx = session.beginTransaction(); IdCard idCard = (IdCard) session.get(IdCard.class, id); tx.commit(); return idCard; } finally { if (session != null) session.close(); } } }
控制台打印结果:
另一种方式是一个外键和一个惟一关键字对应,上面的Employee和Person的例子,如果使用这种关联方式,可以表达成:
<many-to-one name="person" class="Person" column="PERSON_ID" unique="true"/>
如果在Person的映射加入下面几句,这种关联就是双向的:
<one-to-one name"employee" class="Employee" property-ref="person"/>
对于居民与身份证的例子,则配置文件需修改为,如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.hibernate.domain"> <class name="Person" table="person"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <one-to-one name="idCard" property-ref="person"/> </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"> <hibernate-mapping package="org.hibernate.domain"> <class name="IdCard" table="idCard"> <id name="id"> <generator class="native" /> </id> <many-to-one name="person" column="person_id" unique="true" /> </class> </hibernate-mapping>
相关推荐
**标题:“Hibernate 一对一”** **一、Hibernate 概述** Hibernate 是一款强大的 Java 开源对象关系映射(ORM)框架,它简化了数据库与 Java 应用程序之间的交互。ORM 解决了 Java 对象与 SQL 数据库之间的类型不...
hibernate一对一关系映射,我们需要学习的内容包括知识点
本教程“Hibernate一对一实例”是为初学者设计的,旨在帮助你们理解并掌握Hibernate框架中的一对一映射关系。 一、Hibernate简介 Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者用Java对象来表示...
“Hibernate 一对一,一对多,多对多例子” 指的是使用Hibernate框架实现数据库中不同关联关系的示例。Hibernate是一个Java持久化框架,它提供了对象关系映射(ORM)功能,使得开发人员可以方便地在Java对象和关系...
本主题聚焦于Hibernate中的一对一(OneToOne)关系的源码分析,这对于理解Hibernate的工作原理和优化数据访问性能至关重要。 在Hibernate中,一对一关系是指两个实体类之间存在一个唯一的对应关系,通常通过主键...
本篇文章将深入探讨Hibernate中的一对一(OneToOne)和多对一(ManyToOne)关系的源码实现。 **一对一(OneToOne)关系** 在现实生活中,一对一是指两个实体之间存在唯一的关系,例如一个人可能只有一张身份证。在...
**标题详解:**“Hibernate教程04_关系映射之一对一单向外键关联” 在Hibernate框架中,关系映射是数据库表之间的关联在对象模型中的体现。本教程重点讲解了一对一(One-to-One)单向外键关联的实现方法。在数据库...
在本文中,我们将详细介绍Hibernate一对一唯一外键关联映射的概念、配置方法和实践应用。 一对一唯一外键关联映射的概念 在Hibernate中,一对一唯一外键关联映射是指两个实体之间的关联关系,其中一个实体作为外键...
这是一对一双向主键共享方式的映射例子,可以参考一下。
博文链接:https://dlivan.iteye.com/blog/54966
Hibernate从入门到精通(六)一对一双向关联映射 - 赵帅 廊坊师范学院信息技术提高班
【标题】:“Hibernate一对一实例” 在Java开发中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作。在这个“Hibernate一对一实例”中,我们将深入探讨如何使用Hibernate来实现对象与...
本项目“hibernate一对多项目”旨在演示如何在JavaWeb应用中使用Hibernate处理一对多的关系映射。这里我们将深入探讨 Hibernate 的一对多关系、配置以及在实际项目中的应用。 首先,一对多关系在数据库中很常见,...
标题"Hibernate ORM - 一对一连接表关联关系" 提示我们,这里主要讨论的是Hibernate ORM框架在处理数据库中一对一(One-to-One)关联映射的方法。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者用...
hibernate 一对多和多对一的理解 自己的个人看法 大家也来看看
**Hibernate学习包** 在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以...结合提供的博文链接和其他学习资料,相信你能对Hibernate一对一关联有更全面的理解。