背景:

公民和公民的身份证,是一个一对一的例子,一个公民只有一个身份证。

这个是基于主键的,基于外键的映射在:http://blog.csdn.net/nthack5730/article/details/45336457

场景准备:

实体类:Person.java、IdCard.java

Person.java

package h_hbm_oneToOne2;public class Person {private Integer id;private String name;private IdCard idCard;//关联的身份证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 IdCard getIdCard() {return idCard;}public void setIdCard(IdCard idCard) {this.idCard = idCard;}}

IdCard.java

package h_hbm_oneToOne2;public class IdCard {private Integer id;private String number;private Person person;//不要初始化,初始化会使对象处于临时状态,会使保存的时候抛异常,关联的人的对象public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public Person getPerson() {return person;}public void setPerson(Person person) {this.person = person;}}

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">
<!-- This mapping demonstrates -->
<!-- 告诉hibernate需要找哪个表 -->
<hibernate-mapping package="h_hbm_oneToOne2"><!-- User表对应的映射关系 --><class name="IdCard" table="idCard"><id name="id"><generator class="native" /></id><property column="number" name="number" type="string" /><!-- person属性:Person类型表达的是本类与IdCard的一对一关系采用基于主键的一对一映射的方式本方无外键方property-ref:写的是对方映射中外键列对应的属性名,也就是Person类下的idCard属性名--><one-to-one name="person" class="Person"/></class>
</hibernate-mapping>

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">
<!-- This mapping demonstrates -->
<!-- 告诉hibernate需要找哪个表 -->
<hibernate-mapping package="h_hbm_oneToOne2"><!-- User表对应的映射关系 --><class name="Person" table="person"><id name="id"><!-- 当使用基于主键的一对一映射时,有外键方的主键生成策略一定要是foreign 参数property:生成主键值时所根据的对象【一对一时关联的对方】--><generator class="foreign"><param name="property">idCard</param></generator></id><property column="name" name="name" type="string" /><!-- IdCard属性:IdCard类型表达的是本类与IdCard的一对一关系采用基于主键的一对一映射的方式本方有外键--><one-to-one name="idCard" class="IdCard" constrained="true"></one-to-one></class>
</hibernate-mapping>

测试代码:

App.java

package h_hbm_oneToOne2;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;import cn.marer.model.HibernateUtils;public class APP {private static SessionFactory sessionfactory = HibernateUtils.getSessionFactory();@Testpublic void testSave(){Session session = sessionfactory.openSession();//开启事务session.beginTransaction();//构建对象Person person = new Person();person.setName("张三");IdCard id = new IdCard();id.setNumber("123456");person.setIdCard(id);//     session.save(id);session.save(person);//提交事务session.getTransaction().commit();session.close();}@Testpublic void testGet(){Session session = sessionfactory.openSession();//开启事务session.beginTransaction();//获取一方
//      Person person= (Person) session.get(Person.class, 1);
//      System.out.println(person.getName()+"---->" + person.getIdCard());IdCard id = (IdCard) session.get(IdCard.class, 1);System.out.println(id.getNumber() + "---->" + id.getPerson().getName());//提交事务session.getTransaction().commit();session.close();}// 解除关联关系@Testpublic void testRemoveRelation(){Session session = sessionfactory.openSession();// 开启事务session.beginTransaction();// 从无外键方解除关联关系不可以IdCard id = (IdCard) session.get(IdCard.class, 1);id.setPerson(null);// 基于主键的一对一映射,从有外键方解除关联关系,不可以。因为主键不能为空。
//      Person person = (Person) session.get(Person.class, 1);
//      person.setIdCard(null);//提交事务session.getTransaction().commit();session.close();}// 删除对对方的影响@Testpublic void testDelte(){Session session = sessionfactory.openSession();// 开启事务session.beginTransaction();// 会报异常
//      IdCard id = (IdCard) session.get(IdCard.class, 1);
//      session.delete(id);// 如果没有关联的对方,能删除// 如果有关联的对方:因为会直接执行删除自己,所以无外键方会有异常,有外键方没有异常。Person person = (Person) session.get(Person.class, 1);session.delete(person);// 有外键方能维护关联关系,从无外键方不能维护关联关系//提交事务session.getTransaction().commit();session.close();}
}

Hibernate基于主键一对一映射操作实例相关推荐

  1. Hibernate_9_Person和IdCard实例_一对一关系:基于主键

    1)建立Person类:(与8同样) 2)建立IdCard类:(与8同样) 3)建立持久化类:  1>保存方法(与8同样)  2>获取方法(与8同样)  3>删除方法(与8同样)   ...

  2. hibernate一对一主键关联映射(一)---单向关联

    1.新建工程项目hibernate_one2one_pk_1,添加hibernate所需Jar包和mysql驱动Jar包. 2.建立工具类HihernateUtils.java和ExportDB.ja ...

  3. Hibernate(六)一对一映射关系

    One to One 映射关系(只有当映射自定义对象时,才会用,hibernate支持的java类型都可直接设成属性,了解第一和第二种的xml即可) 基于外键的单向一对一 (xml和annotatio ...

  4. Hibernate 之主键生成策略

    目录 前言 示例 准备 数据库建表 实体类定义和对应的xml配置 DemoDao 程序员自己控制:assigned 数据库控制 identity(标识列/自动增长) sequence:内部序列 Hib ...

  5. Hibernate各种主键生成策略与配置详解 - 真的很详细啊!!

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  6. Hibernate各种主键生成策略与配置详解

    为什么80%的码农都做不了架构师?>>>    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibern ...

  7. hibernate 各种主键生成策略(转)

    http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指 ...

  8. hibernate中主键的生成策略

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  9. oracle hibernate 主键,hibernate oracle 主键 自增

    Hibernate 实现对oracle 数据库表ID的自动增长 1:建表 Create      table        test_table       ( id      integer     ...

最新文章

  1. GitHub 13.1k | 所有的编程知识,都在这100 张思维导图里了
  2. boost::test模块测试从数据集对主测试套件的访问
  3. 算法工程师和python_算法工程师只掌握Python行吗?如果在java和cpp中选一门语言学习哪个更有用?...
  4. 6818 开发板 配置 ubuntu 桌面环境 与 ROS
  5. 算法题:(1) 有一个集合R = [a, b, c, d, e, f, g, h, i, j, k, l, m, n, ],....请写出求解这样的一个子集的通用算法。
  6. MFC CListCtrl实现双击编辑
  7. 【SQLMap工具-1】SQLMap简介及简单应用实例
  8. java速成(11/30)抽象类 abstract
  9. MATLAB简单解决输出某个数(组)内自然数的阶乘和问题
  10. Java单例模式——线程安全的懒汉模式
  11. css内联样式---动态绑定背景图片
  12. ubuntu下qt模拟键盘按键按下_Qt 项目之虚拟键盘
  13. 【Scratch考级99图】图26-等级考试scratch绘制复杂图形旋转三角形 少儿编程 scratch画图案例教程
  14. 更快更安全,HTTPS 优化总结
  15. 【单片机开发】stm32f429在线IAP 实现SD卡烧写程序
  16. 华为、微软、瑞幸、维达、奈飞、爱彼迎等公司高管变动
  17. Android 本地路径问题
  18. 如何找到局域网中的另外一个电脑
  19. 人民银行简历计算机水平,人民银行招聘,填写简历有哪些技巧?
  20. everpano 3D立体漫游软件

热门文章

  1. Debian选择并安装软件需要下载很久的解决办法
  2. LVGL V8之border styles
  3. 个人实用java 常用语句(工作笔记)
  4. jack -学习颜色的调配
  5. 全球变暖的影响与原因
  6. HCIP(华为高级网络安全工程师)(第五天)(OSPF协议1)
  7. 计算机网络三大必备书,网络十大神书据说都看过的可以成仙
  8. 【MPI】矩阵向量乘法
  9. 为什么我想要一个投影仪?微鲸F1智能投影仪首发评测
  10. java开发工程师报名费多少_都说Java工程师的薪资比较高,事实真是如此吗?