数据库模型

  一般对一对一的关系而言,会存在一个主从关系。如 人 与 身份证,就是一个一对一关系, 人 是主,身份证 是从

Person

  PK:id

    name

    age

Id_Card

  PK、FK:id

    useful_life

一般在设计的时候,对于主表的id,由自增长或序列产生,从表的主键id可以直接使用主表的主键id,不需要自己重新生成


Domain

  1. package org.zln.hibernate.domain;
  2.  
  3. /**
  4. * Created by coolkid on 2015/6/20 0020.
  5. */
  6. public class Person {
  7. private int id;
  8. private String name;
  9. private IdCard idCard;
  10. ... }
  1. package org.zln.hibernate.domain;
  2.  
  3. /**
  4. * Created by coolkid on 2015/6/20 0020.
  5. */
  6. public class IdCard {
  7. private int id;
  8. private String usefulLife;//证件有效期
  9. private Person person;
  10. ...
  11. }

XML

Person.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="org.zln.hibernate.domain">
  6.  
  7. <class name="Person" table="person">
  8. <id name="id" column="id">
  9. <generator class="native"/>
  10. </id>
  11. <property name="name" column="name"/>
  12. <!--一对一关系映射-->
  13. <one-to-one name="idCard" />
  14. </class>
  15.  
  16. </hibernate-mapping>

IdCard.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="org.zln.hibernate.domain">
  6.  
  7. <class name="IdCard" table="id_card">
  8. <id name="id" column="id">
  9. <!--主键依赖类中的属性-->
  10. <generator class="foreign">
  11. <!--外键从person属性中引用过来 从person 的 getId 方法获取-->
  12. <param name="property">person</param>
  13. </generator>
  14. </id>
  15. <property name="usefulList" column="useful_life"/>
  16. <!--一对一关系映射-->
  17. <one-to-one name="person" />
  18. </class>
  19.  
  20. </hibernate-mapping>

Dao

  1. package org.zln.hibernate.dao;
  2.  
  3. import org.hibernate.Session;
  4. import org.hibernate.Transaction;
  5. import org.zln.hibernate.domain.IdCard;
  6. import org.zln.hibernate.domain.Person;
  7. import org.zln.hibernate.utils.HibernateUtils;
  8.  
  9. /**
  10. * Created by coolkid on 2015/6/20 0020.
  11. */
  12. public class PersonDao {
  13.  
  14. /**
  15. * 保存Person及其IdCard
  16. * @param person 人
  17. * @param idCard 身份证
  18. */
  19. public void savePerson(Person person,IdCard idCard){
  20. Session session = null;
  21. Transaction transaction = null;
  22. try {
  23. session = HibernateUtils.getSession();
  24. transaction = session.beginTransaction();
  25.  
  26. person.setIdCard(idCard);
  27. idCard.setPerson(person);
  28.  
  29. session.save(person);
  30. session.save(idCard);
  31.  
  32. transaction.commit();
  33. }finally {
  34. if (session != null){
  35. session.close();
  36. }
  37. }
  38. }
  39.  
  40. /**
  41. * 通过id查询person
  42. * @param person person
  43. * @return Person
  44. */
  45. public Person getPerson(Person person){
  46. Session session = null;
  47. Person person1 = null;
  48. try {
  49. session = HibernateUtils.getSession();
  50. person1 = (Person) session.get(Person.class,person.getId());
  51. }finally {
  52. if (session != null){
  53. session.close();
  54. }
  55. }
  56. return person1;
  57. }
  58. }

另一种一对一关系的实现,就是使用多对一的方法,但是对“多”加唯一性约束

在配置IdCard的name属性时,使用<many-to-one>标签,对应的column是person_id,设置unique="true",这样也实现了一对一关系映射

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="org.zln.hibernate.domain">
  6.  
  7. <class name="IdCard" table="id_card">
  8. <id name="id" column="id">
  9. <generator class="native"/>
  10. </id>
  11. <property name="usefulList" column="useful_life"/>
  12. <many-to-one name="person" column="person_id" unique="true" not-null="true"/>
  13. </class>
  14.  
  15. </hibernate-mapping>

Hibernate关联映射之_一对一的更多相关文章

  1. Hibernate关联映射之_多对一

    多对一 Employee-Department 对于 员工 和 部门 两个对象,从员工的角度来看,就是多对一的一个关系--->多个员工对应一个部门 表设计: 部门表:department,id主 ...

  2. Hibernate关联映射之_一对多

    domain: package org.zln.hibernate.domain; import java.util.Set; /** * 部门Domain对象 * Created by sherry ...

  3. Java三大框架之——Hibernate关联映射与级联操作

    什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...

  4. (转)Hibernate关联映射——对象的三种关系

    http://blog.csdn.net/yerenyuan_pku/article/details/70148618 Hibernate关联映射——对象的三种关系 Hibernate框架基于ORM设 ...

  5. Hibernate关联映射(一对多/多对多)

    版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/843401053.  Hibernate关联映射上接Hibernate持久化类:h ...

  6. Hibernate关联映射关系

    Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...

  7. Oracle primary,unique,foreign 区别,Hibernate 关联映射

    Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...

  8. 第六章 Hibernate关联映射

    第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...

  9. 【学习笔记】Hibernate关联映射(Y2-1-6)

    Hibernate关联映射 关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 1.单向多对一关联 准备数据库 部门表和员工表 其中部门表有两列 部门编号和名称 员工表有三列 员工 ...

随机推荐

  1. jdbc执行过程 jar包下载

    工具和准备: MYSQL 8.0jar包: 链接:https://pan.baidu.com/s/1O3xuB0o1DxmprLPLEQpZxQ 提取码:grni 使用eclipse开发首先把jar包 ...

  2. python核心编程2 第七章 练习

    7-4. 建立字典. 给定两个长度相同的列表,比如说,列表[1, 2, 3,...]和['abc', 'def','ghi',...],用这两个列表里的所有数据组成一个字典,像这样:{1:'abc', ...

  3. 分布式日志系统ELK搭建

    ELK:Elasticsearch  Logstash Kibana Elasticsearch:是基于JSON的分布式搜索和分析引擎,专为实现水平扩展.高可用和管理便捷性而设计 Logstash:是 ...

  4. Layabox进阶之资源加载

    资源加载失败,图片资源默认类型是image 如果是sprite可能找不到. 资源的加载顺序,场景被加载出来时,要判断该场景的资源是否都已经加载到. 点击A界面弹出来B界面,A界面的资源要在B界面之前加 ...

  5. BigData--hadoop集群搭建之hbase安装

    之前在hadoop-2.7.3 基础上搭建hbase 详情请见:https://www.cnblogs.com/aronyao/p/hadoop.html 基础条件:先配置完成zookeeper 准备 ...

  6. Python基础02

    6.变量定义的规则: # 变量,只能由 字母 数字 下划线 特例:不能用数字开头 Python关键字,也不能使用 'and', 'as', 'assert', 'break', 'class', 'c ...

  7. Scrapy之CrawlSpider

    问题:如果我们想要对某一个网站的全站数据进行爬取?解决方案: 1. 手动请求的发送 2. CrawlSpider(推荐) CrawlSpider概念:CrawlSpider其实就是Spider的一个子 ...

  8. python 用装饰器写登录

    # 1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件), # 要求登录成功一次,后续的函数都无需再输入用户名和密码 # FLAG = False # def login(func): ...

  9. Leecode刷题之旅-C语言/python-88合并两个有序数组

    /* * @lc app=leetcode.cn id=88 lang=c * * [88] 合并两个有序数组 * * https://leetcode-cn.com/problems/merge-s ...

  10. 《史上最简单的MySQL教程》系列分享专栏

    <史上最简单的MySQL教程>系列分享专栏 <史上最简单的MySQL教程>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read ...