假设我们有两张表,人员信息表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. Daily Scrum02 12.16

    鉴于近期数据库大作业提交到了关键时期,大家的时间都十分的紧张,因而,我们决定全团队成员交替作业,不在每日每个成员都分配任务,而只需要每个成员保证每两天一次的工作量,以此方式给大家腾出去完成自己的事情. ...

  2. ArcGIS AddIN开发:如何调用ArcMap中的选择工作空间的窗体

    示例代码如下: public static IWorkspaceName BrowseWorkspace(int hwnd,out IWorkspace ws) { IGxObjectFilterCo ...

  3. 部署Thomas Kyte 的 runstats 工具

    runstats是由Thomas Kyte开发的脚本,该脚本能对做同一件事的两个不同方法进行比较,得出孰优孰劣的结果. 1.授权 SQL> grant select on v_$statname ...

  4. jquery 回到顶部,简洁大方

    效果

  5. TP5与TP3.X对比

    首先声明本章节并非是指导升级旧的项目到5.0,而是为了使用3.X版本的开发者更快的熟悉并上手这个全新的版本.同时也强烈建议开发者抛弃之前旧的思维模式,因为5.0是一个全新的颠覆重构版本. 需要摒弃的3 ...

  6. php面试 1013总结

    面试题1:http://www.docin.com/p-288430879.html 数据库优化: session和cookies区别 缓存系统有哪些 myisam和InDB读写区别 varchar和 ...

  7. java 连接数据库

    1.获取服务器端数据库blog中记录数 package dataprocess; import java.io.BufferedWriter; import java.io.FileWriter; i ...

  8. window.location事件

    一.最外层top跳转页面,适合用于iframe框架集 top.window.location.href("${pageContext.request.contextPath}/Login_g ...

  9. jquery的each

    each()方法能使DOM循环结构简洁,不容易出错.each()函数封装了十分强大的循环功能,使用也很方便,它可以循环一维数组.多维数组.DOM, JSON 等等在javaScript开发过程中使用$ ...

  10. Javascript设置对象属性为"只读"

    有时为了保护某些属性,让其无法被更改,我们会把他们设置为常量. 在某些语言里面,也许会用const来实现这样的功能.本文讲述如何在Javascript中实现这样的功能. 方法一: var myObje ...