1.新建工程项目hibernate_one2one_ufk_2,添加hibernate所需的Jar包和数据库驱动的Jar包。

2.编写工具类HibernatUtils.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. private Person person;
  6. public int getId() {
  7. return id;
  8. }
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public String getCardNo() {
  13. return cardNo;
  14. }
  15. public void setCardNo(String cardNo) {
  16. this.cardNo = cardNo;
  17. }
  18. public Person getPerson() {
  19. return person;
  20. }
  21. public void setPerson(Person person) {
  22. this.person = person;
  23. }
  24. }

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. <one-to-one name="person" property-ref="idCard" />
  12. </class>
  13. </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="native" />
  9. </id>
  10. <property name="name"/>
  11. <many-to-one name="idCard" unique="true" />
  12. </class>
  13. </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_ufk_2</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.在项目下新建一个SourceFolder,命名为test,在该包下编写单元测试类One2OneTest,进行单元测试,它的代码如下:

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. //不能保存,因为idCard是Transident状态
  17. session.save(person);
  18. session.getTransaction().commit();
  19. }catch(Exception e) {
  20. e.printStackTrace();
  21. session.getTransaction().rollback();
  22. }finally {
  23. HibernateUtils.closeSession(session);
  24. }
  25. }
  26. public void testSave2() {
  27. Session session = null;
  28. try {
  29. session = HibernateUtils.getSession();
  30. Transaction tx = session.beginTransaction();
  31. IdCard idCard = new IdCard();
  32. idCard.setCardNo("88888888");
  33. session.save(idCard);
  34. Person person = new Person();
  35. person.setName("李小晚");
  36. person.setIdCard(idCard);
  37. session.save(person);
  38. session.getTransaction().commit();
  39. }catch(Exception e) {
  40. e.printStackTrace();
  41. session.getTransaction().rollback();
  42. }finally {
  43. HibernateUtils.closeSession(session);
  44. }
  45. }
  46. public void testLoad1() {
  47. Session session = null;
  48. try {
  49. session = HibernateUtils.getSession();
  50. Transaction tx = session.beginTransaction();
  51. Person person = (Person)session.load(Person.class, 2);
  52. System.out.println("person.name:" + person.getName() );
  53. System.out.println("idCard.name:" + person.getIdCard().getCardNo());
  54. session.getTransaction().commit();
  55. }catch(Exception e) {
  56. e.printStackTrace();
  57. session.getTransaction().rollback();
  58. }
  59. }
  60. public void testLoad2() {
  61. Session session = null;
  62. try {
  63. session = HibernateUtils.getSession();
  64. Transaction tx = session.beginTransaction();
  65. IdCard idCard= (IdCard)session.load(IdCard.class, 1);
  66. System.out.println("idCard.name:" + idCard.getCardNo());
  67. System.out.println("person.name:" + idCard.getPerson().getName());
  68. session.getTransaction().commit();
  69. }catch(Exception e) {
  70. e.printStackTrace();
  71. session.getTransaction().rollback();
  72. }
  73. }
  74. }

总结:hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard)

一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载
其关联对象,默认根据主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,
所以不能指定主键加载person,而要根据person的外键加载,所以采用如下映射方式:
<one-to-one name="person" property-ref="idCard"/>

hibernate一对一主键唯一外键关联(二)相关推荐

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

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

  2. hibernate one2one 唯一外键关联(双向关联)

    hibernate的一对一唯一外键关联映射(双向关联 Person <------->IdCard) 一对一唯一外键关联采用<one - to -one>标签映射,必须指定标签 ...

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

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

  4. 数据表的字段约束:主键、外键、唯一

    一.主键:标记数据唯一非空,一个表最多只能有一个主键. CREATE TABLE products (product_no integer PRIMARY KEY, --主键约束,保证唯一且非空.-- ...

  5. MySQL的几个概念:主键,外键,索引,唯一索引

    一.概念: 1.主键(primary key) 能够唯一标识表中某一行的属性或属性组.一个表只能有一个主键,但可以有多个候选索引.主键常常与外键构成参照完整性约束,防止出现数据不一致.主键可以保证记录 ...

  6. 将一张表的主键作为外键关联到另一张表中

    将一张表的主键作为外键关联到另一张表中 1.外键的介绍 2.使用Navicat创建外键 3.外键的维护关系设定及其选择 1.外键的介绍 设置外键的作用很明显,就是讲两个表的数据产生关联,就比如个人信息 ...

  7. MySQL设置主键、联合主键、外键、唯一约束、非空约束、默认约束

    MySQL登录.查看记录等基本操作 MySQL设置表的属性值自动增加 auto_increment 1.主键.联合主键.外键 1.什么是主键 主键是在多条记录中用于确定一条记录时使用的标识符.主键具备 ...

  8. 约束条件之主键与外键

    文章目录 约束条件之主键 约束条件之外键 外键约束的创建 表关系之多对多 表关系之一对一 表关系之一对多 今日作业 书籍表与出版社表(多对多) 学生表与班级表(一对多) 老师表与课程表(一对一) 课程 ...

  9. SQL的主键和外键约束

    SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外 ...

最新文章

  1. 5G 信令流程 — 5GC 的业务请求(Service Request)
  2. CSS 伪类与伪元素
  3. UNITY2018 真机开启deepprofiling的操作
  4. 大剑无锋之new一个对象背后发生了什么?
  5. nametuple用法(转)
  6. abs期刊分类2020_收藏:中科院期刊最新分区来了!| 附516本生物医学等五大领域一区汇总...
  7. 【LoadRunner技术讲座8】LoadRunner函数中的几个陷阱
  8. java拼接sql字符串
  9. Keil C51 Code Banking
  10. linux pack文件镜像,使用buildpack-deps 构建自己的入容器镜像
  11. 常微分方程——一阶微分方程的初等解法
  12. 河北省计算机科学专业高校排名,河北省计算机类专业大学排名
  13. [ROS Navigation Tuning Guide]翻译
  14. java 百万数据查询_JAVA技巧:Java中的大量数据查询
  15. 一篇个人原厂的非主流火星文
  16. 在 Windows Server 2003 企业服务器中如何配置 IPv6 协议
  17. m4s格式转换mp3_怎么把腾讯缓存的视频转换成MP3格式
  18. 运行mysql时,提示Table ‘performance_schema.session_variables’ doesn’t exis
  19. 如何计算机车启动牵引力,高中物理机车启动的两种方式分析
  20. mysql注入单引号被过滤_避开sql注入过滤的几个方法

热门文章

  1. Au入门系列之一:认识 Audition
  2. 2021腾讯社招java技术岗面试题
  3. 限流对于抖音玩家来说,无异于被宣布了“死亡”。
  4. etc通行费发票怎么打印?通行费发票打印步骤
  5. 一图秒懂 - MD文件语法标签,最简单的markdown入门
  6. markdown符号使用
  7. pjsip 设置麦克风语音输入量 扬声器播放
  8. python编辑程序、根据输入的百分制数_输入一个百分制成绩,利用switch语句编写程序,要求输出成绩等级A B C D,E。90以上为A...
  9. 家谱文化研究②:比赘婿更不光彩的家庭角色?何雨柱还乐在其中
  10. 烤仔建工 | Wearable Dao时装秀倒计时!在元宇宙里穿上“中国红”!