1.新建工程项目hibernate_one2one_pk_1,添加hibernate所需Jar包和mysql驱动Jar包。

2.建立工具类HihernateUtils.java和ExportDB.java,代码如下:

HibernateUtils.java

  1. package com.i51pro.hibernate;
  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.cfg.Configuration;
  5. public class HibernateUtils {
  6. private static SessionFactory sessionFactory;
  7. static {
  8. try {
  9. Configuration cfg = new Configuration().configure();
  10. sessionFactory = cfg.buildSessionFactory();
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. public static SessionFactory getSessionFactory() {
  16. return sessionFactory;
  17. }
  18. public static Session getSession() {
  19. return sessionFactory.openSession();
  20. }
  21. public static void closeSession(Session session) {
  22. if (session != null) {
  23. if (session.isOpen()) {
  24. session.close();
  25. }
  26. }
  27. }
  28. }

ExportDB.java

  1. package com.i51pro.hibernate;
  2. import org.hibernate.cfg.Configuration;
  3. import org.hibernate.tool.hbm2ddl.SchemaExport;
  4. public class ExportDB {
  5. /**
  6. * @param args
  7. */
  8. public static void main(String[] args) {
  9. Configuration cfg = new Configuration().configure();
  10. SchemaExport export = new SchemaExport(cfg);
  11. export.create(true, true);
  12. }
  13. }

3.编写实体类和映射文件,代码如下:

IdCard.java

  1. package com.i51pro.hibernate;
  2. public class IdCard {
  3. private int id;
  4. private String cardNo;
  5. public int getId() {
  6. return id;
  7. }
  8. public void setId(int id) {
  9. this.id = id;
  10. }
  11. public String getCardNo() {
  12. return cardNo;
  13. }
  14. public void setCardNo(String cardNo) {
  15. this.cardNo = cardNo;
  16. }
  17. }

Person.java

  1. package com.i51pro.hibernate;
  2. public class Person {
  3. private int id;
  4. private String name;
  5. private IdCard idCard;
  6. public int getId() {
  7. return id;
  8. }
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public IdCard getIdCard() {
  19. return idCard;
  20. }
  21. public void setIdCard(IdCard idCard) {
  22. this.idCard = idCard;
  23. }
  24. }

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>
  6. <class name="com.i51pro.hibernate.IdCard" table="t_idcard">
  7. <id name="id">
  8. <generator class="native"/>
  9. </id>
  10. <property name="cardNo"/>
  11. </class>
  12. </hibernate-mapping>

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>
  6. <class name="com.i51pro.hibernate.Person" table="t_person">
  7. <id name="id">
  8. <generator class="foreign">
  9. <param name="property">idCard</param>
  10. </generator>
  11. </id>
  12. <property name="name"/>
  13. <one-to-one name="idCard" constrained="true" />
  14. </class>
  15. </hibernate-mapping>

4.编写hibernate映射文件,代码如下:

hibernate.cfg.xml

  1. <!DOCTYPE hibernate-configuration PUBLIC
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  4. <hibernate-configuration>
  5. <session-factory>
  6. <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_one2one_pk_1</property>
  7. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  8. <property name="hibernate.connection.username">root</property>
  9. <property name="hibernate.connection.password">admin</property>
  10. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  11. <property name="hibernate.show_sql">true</property>
  12. <mapping resource="com/i51pro/hibernate/Person.hbm.xml"/>
  13. <mapping resource="com/i51pro/hibernate/IdCard.hbm.xml"/>
  14. </session-factory>
  15. </hibernate-configuration>

5.在工程项目hibernate_one2one_ pk_1下新建一个SourceFolder,命名为test,编写单元测试类One2OneTest.java,代码如下:

One2OneTest.java

  1. package com.i51pro.hibernate;
  2. import org.hibernate.Session;
  3. import org.hibernate.Transaction;
  4. import junit.framework.TestCase;
  5. public class One2OneTest extends TestCase {
  6. public void testSave1() {
  7. Session session = null;
  8. try {
  9. session = HibernateUtils.getSession();
  10. Transaction tx = session.beginTransaction();
  11. IdCard idCard = new IdCard();
  12. idCard.setCardNo("88888888");
  13. Person person = new Person();
  14. person.setName("李小晚");
  15. person.setIdCard(idCard);
  16. /**
  17. * 不会发生TransientOabjectException异常
  18. * 因为一对一主键关联映射中,默认了cascade属性
  19. */
  20. session.save(person);
  21. session.getTransaction().commit();
  22. }catch(Exception e) {
  23. e.printStackTrace();
  24. session.getTransaction().rollback();
  25. }finally {
  26. HibernateUtils.closeSession(session);
  27. }
  28. }
  29. public void testLoad1() {
  30. Session session = null;
  31. try {
  32. session = HibernateUtils.getSession();
  33. Transaction tx = session.beginTransaction();
  34. Person person = (Person)session.load(Person.class, 1);
  35. System.out.println("person.name:" + person.getName() );
  36. System.out.println("idCard.name:" + person.getIdCard().getCardNo());
  37. session.getTransaction().commit();
  38. }catch(Exception e) {
  39. e.printStackTrace();
  40. session.getTransaction().rollback();
  41. }
  42. }
  43. }

总结:hibernate一对一主键关联映射(单向关联Person---->IdCard)

一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建

具体映射:

<id name="id">
  <!-- person的主键来源idCard,也就是共享idCard的主键 -->
  <generator class="foreign">
   <param name="property">idCard</param>
  </generator>
 </id>
 <property name="name"/>
 <!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
 constrained="true", 表明当前主键上存在一个约束,person的主键作为外键参照了idCard 
  -->
 <one-to-one name="idCard" constrained="true"/>

hibernate一对一主键关联映射(一)---单向关联相关推荐

  1. hibernate一对一主键唯一外键关联(一)

    1.新建工程项目hibernate_one2one_ufk_1,添加hibernate所需Jar包和数据库驱动Jar包. 2.编写工具类HibernateUtils.java和ExportDB.jav ...

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

    1.新建工程项目hibernate_one2one_pk_2,加入hibernate所需的Jar包和数据库mysql驱动Jar包. 2.编写工具类HibernateUtils.java和ExportD ...

  3. Hibernate一对一主键单向关联

    2019独角兽企业重金招聘Python工程师标准>>> 模型user,address address对user进行外键关联,意思就是address的主键是由user的主键关联生成的, ...

  4. hibernate的一对一主键双向映射关系和外键双向映射关系(一)

    主键关联的重点是关联的两个表共享一个主键值.本例中采用,一个单位在网上的一个系统中注册会员. 1,会员数据保存在会员表company中,每个会员的登录账号保存在表login中: 2,一个会员只有一个登 ...

  5. hibernate一对一主键唯一外键关联(二)

    1.新建工程项目hibernate_one2one_ufk_2,添加hibernate所需的Jar包和数据库驱动的Jar包. 2.编写工具类HibernatUtils.java和ExportDB.ja ...

  6. hibernate一对一主键关联映射(单向关联Person-----IdCard)

    一对一关联映射原理:让两个实体的主键一样,这样就不需要加入多余的字段 例子: package com.hibernate; public class IdCard { private int id; ...

  7. 一对多关联映射(单向关联)见项目:me_one_to_many

    1. 模型 一个用户组(group)对应多个用户. 2. 实体类(省略set,get方法) public class User { private int id; private String nam ...

  8. Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联...

    2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...

  9. Hibernate 一对一外键单向关联

    [align=center][size=medium]Hibernate 一对一外键单向关联[/size][/align] 基于外键关联的单向一对一关联和单向多对一关联几乎是一样的.唯一的不同就是单向 ...

最新文章

  1. 微信小程序左上角返回按钮跳转到指定页面
  2. Vue.Draggable 实现组件拖拽
  3. nidlist 问题
  4. Python3 django2.0 字段加密 解密 AES
  5. c语言上机注意事项,计算机三级(C语言)上机考试题型总结与注意事项(讲解详细)...
  6. android 双人黑白棋开发博客,黑白棋 - 软件资讯 - 课堂党年级博客
  7. quartus怎么仿真波形_单相半波可控整流电路电阻负载的Matlab Simulink仿真
  8. C语言试题七十六之请编写函实现百钱买百鸡
  9. linux tar进行归档压缩和解压
  10. 多线程导出excel高并发_怎么理解分布式、高并发、多线程
  11. STM32 学习总结2 ----利用中断来控制按键点灯、捕获功能练习
  12. Linux shell 脚本入门教程+实例
  13. 超级安全!Python 合成多张图片到PDF格式
  14. office2016+visio2016
  15. python实现直方图规定化
  16. 3.3、怎么通过STLINK下载程序(附STLINK驱动包)
  17. Mysql获取当天用户生日
  18. 台式计算机能分享热点吗,如何在电脑上开热点 台式电脑开热点的方法有哪些...
  19. 关于redis创建集群时出现[ERR] Node x.x.x.x:6379 is not empty. Either the node already knows other nodes (check
  20. 来来来!关于iOS基础面试咱俩好好唠唠

热门文章

  1. [立创传智黑马程序员CSDN]训练营——仿生机械狗
  2. 股票深度分析,深度诊断股票
  3. Python学习——02-Python基础——【4-文件处理与三元运算】
  4. 光盘如何重装系统教程
  5. 把计算机信息传到电视屏的方法,如何将电脑内容投屏到电视上?当贝市场完整版教程...
  6. CC00204.CloudKubernetes——|KuberNetes高级调度.V07|——|初始化容器|InitContainer操作|
  7. PAT1087 有多少不同的值 (20 分)(C语言)
  8. mysql备份恢复与集群部署
  9. 堪称最美丽的3D场景模型:大雪后的城堡 制作全过程分享
  10. 安移通(ARUBA)WiFi短信验证:无线上网热点短信认证设置流程