假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射关系,只需要在单向多对一的映射关系的多的一端的配置文件的<many-to-one>标签中添加一个unique="true",这里介绍双向一对一映射关系的配置方法:

新建一个Person实体类:

public class Person {

    private int id;
private String name;
private int age;
private IdCard idCard;
//get/set方法省略
}

新建一个IdCard实体类:

public class IdCard {

    private int id;
private String code;
private Person person;
//get/set方法省略
}

在当前包下新建Person类的映射文件Person.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="com.wang.pojo">
<class name="Person" >
<id name="id">
<generator class="native"></generator>
</id> <property name="name"></property>
<property name="age"></property>
<many-to-one name="idCard" class="IdCard" column="IdCard_id" cascade="save-update" unique="true" not-null="true"></many-to-one>
</class>
</hibernate-mapping>

在当前包下新建IdCard类的映射文件IdCard.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="com.wang.pojo">
<class name="IdCard" >
<id name="id">
<generator class="native"></generator>
</id> <property name="code"></property>
<!-- 此标签的name属性是当前类中设置的关联类的对象名,property-ref属性是指关联类中设置的此类的对象名 -->
<one-to-one name="person" property-ref="idCard"></one-to-one>
</class>
</hibernate-mapping>

将两个映射文件添加到hibernate.cfg.xml中去,新建一个测试类,测试1:自动生成表结构2:保存数据3:读取数据:

@Test
public void testCreateDB() {
Configuration cfg = new Configuration().configure();
SchemaExport se = new SchemaExport(cfg);
// 第一个参数是否生成ddl脚本 第二个参数是否执行到数据库
se.create(true, true);
} @Test
public void testSave() {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
// Score s=new Score(2,12,97);
// session.save(s);
IdCard id1=new IdCard();
id1.setCode("3713251882923783494");
IdCard id2=new IdCard();
id2.setCode("3713251882925378612");
Person p1=new Person();
p1.setName("李云龙");
p1.setAge(41);
p1.setIdCard(id1);
Person p2=new Person();
p2.setName("楚云飞");
p2.setAge(34);
p2.setIdCard(id2); session.save(p1);
session.save(p2);
//session.save(p3); tx.commit();
session.close();
} @Test
public void testGet() {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
// Person p=(Person)session.get(Person.class, 1);
// System.out.println("name="+p.getName()+"===idcard="+p.getIdCard().getCode());
IdCard id=(IdCard)session.get(IdCard.class, 1);
System.out.println("name="+id.getPerson().getName()+"==idcard="+id.getCode());
tx.commit();
session.close();
}

注意:在读取数据时,既可以通过读取Person读取到IdCard的信息,也可以通过读取IdCard读取到Person的数据,不同的地方在:通过Person类(以<many-to-one>标记的类)读取Incard中的数据的时候会执行更多的sql语句,而通过IdCard类(以one-to-one标记的类)读取Person中的信息只执行了一条sql语句,但是我并不确定后者的效率就高,只是发现了这个现象.

hibernate笔记--基于外键的单(双)向的一对一映射关系的更多相关文章

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

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

  2. Hibernate之基于外键映射的一对一(1-1)关联关系

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

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

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

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

    这篇讲解基于外键的一对一单向关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 注意:基于外键的一对一关联的表结构和多对一的表结构是一致的,但是,外键是唯一的. 2.类的结构 Pe ...

  5. Hibernate学习(二)关系映射----基于外键的单向一对一

    事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...

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

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

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

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

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

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

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

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

随机推荐

  1. *POJ1830 高斯消元

    开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8010   Accepted: 3161 Description ...

  2. mysql 表表连接的问题。

    select * from table a, table b where a.aid = b.bid and aid >100 这样连接,如果a有数据,b没有数据,  a.aid = b.bid ...

  3. cookies,sessionStorage 和 localStorage区别

    cookies,sessionStorage 和 localStorage 的区别 cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密). cook ...

  4. 内存不足时,调用ajax报的错

    在error中遍历出来的异常   很难见

  5. Visual Studio中创建混合移动应用程序解决方案Xamarin Portable Razor

    在Visual Studio中创建混合移动应用程序的一个解决方案是使用Xamarin Portable Razor工具,这是ASP.NET MVC API针对移动设备的一个轻量级实现.Xamarin编 ...

  6. UWP图片编辑器(涂鸦、裁剪、合成)

    一.编辑器简介 写这个控件之前总想找一找开源的,可以偷下懒省点事.可是各种地方都搜遍了也没有找到. 于是,那就做第一个吃螃蟹的人吧! 控件主要有三个功能:涂鸦.裁剪.合成. 涂鸦:主要是用到了InkT ...

  7. 在C#代码中应用Log4Net(五)将Log4Net正确地封装在自己的类库中并进行调用

    前面的几篇文章已经比较完整地解释了怎么使用Log4Net,但是我们可能需要将Log4Net的日志类封装在自己的类库中,以便C/S或B/S程序进行调用.下面的示例程序简单地分为两层,一个是应用程序层We ...

  8. CVTE实习求职经历

    今天,听到有好多同学最近要去面试CVTE这家企业,于是呢,准备将自己的经历写上来,给大家一个参考,希望能够大家一次帮助. 一.整体感觉 首先呢,先讲一下我个人对这家企业的整体感觉吧. 1. 第一次 对 ...

  9. 小型文件数据库 (a file database for small apps) SharpFileDB

    小型文件数据库 (a file database for small apps) SharpFileDB For english version of this article, please cli ...

  10. KnockoutJS 3.X API 第七章 其他技术(2) 使用扩展器来增加可观察量(监控属性)

    Knockout observables提供了支持读取/写入值并在值改变时通知订阅者所需的基本功能. 但在某些情况下,您可能希望向可观察者添加其他功能. 这可能包括通过在可观察者前面放置一个可写的计算 ...