hibernate一对一关系映射hibernate一对一关系映射
一对一关系映射即为关系双方都含有对方一个引用,其实在生活中一对一关系也很常见,比如人和身份证,学生和学号等,都是一对一的关系映射,一对一映射分为单向的和双向的,没种关系映射又可以分为主键关联映射,唯一外键关联映射。
一:主键关联映射
一般一对一主键关联映射通过foreign主键生成器使用另外一个相关联的对象的标识符。通常和联合起来使用。一对一主键关联映射原理:让两个实体的主键一样,这样就不需要加入多余的字段。此种关联映射有一定的缺点:单向一对一主键关联实际上限制很多,因为你只有IdCar...
hibernate一对一关系映射
一对一关系映射即为关系双方都含有对方一个引用,其实在生活中一对一关系也很常见,比如人和身份证,学生和学号等,都是一对一的关系映射,一对一映射分为单向的和双向的,没种关系映射又可以分为主键关联映射,唯一外键关联映射。
一:主键关联映射
一般一对一主键关联映射通过foreign主键生成器使用另外一个相关联的对象的标识符。通常和
联合起来使用。一对一主键关联映射原理:让两个实体的主键一样,这样就不需要加入多余的字段。此种关联映射有一定的缺点:单向一对一主键关联实际上限制很多,因为你只有IdCard插入了那才能有这个Person.我们看一下具体示例:
根据上面的关系类图,我们再来看一下实体类的定义
实体IdCard.java
[java] view plaincopyprint?
1. public class IdCard
2.
3. {
4.
5. private String id;
6.
7. private int number;
8.
9. private Person person; 10.
11. }
实体:Person.java
[java] view plaincopyprint?
1. public class Person
2.
3. {
4.
5. private String id;
6.
7. private String name; 8.
9. private IdCard idCard; 10.
11. }
IdCard的配置文件:
[html] view plaincopyprint?
1.
2.
5.
6.
7.
8.
11.
12.
13.
14.
15.
16.
person的配置文件:
[html] view plaincopyprint?
1.
2.
5.
6.
7.
8.
9.
10. idCard
11.
12.
13.
14.
15.
16.
注:one-to-one标签告诉hibernate根据主键加载引用对象 , 把person
中的主键拿到idCard表中进行查找,然后把查到的信息加载到引用对象中采用一对一主键约束,那么必须设置constrained属性,表示当前主键作为外键参照了该属性在一对一主键关联映射中默认问级联属性
配置完了以后我们来看一下具体的增删改查操作:
[java] view plaincopyprint?
1. Person person = newPerson();
2.
3. person.setName("zhangsan"); 4.
5. IdCard idCard = new IdCard(); 6.
7. idCard.setNumber(987654); 8.
9. person.setIdCard(idCard); 10.
11. idCard.setPerson(person); 12.
13. Session session = sessionFactory.openSession();
14.
15. Transaction tx = null; 16.
17.
18.
19. try
20.
21. {
22. tx =session.beginTransaction();
23. session.save(person); 24. tx.commit(); 25. }
26. catch(Exception ex) 27. {
28. ex.printStackTrace(); 29. if(null != tx) 30. {
31. tx.rollback(); 32.
33. }
34. }
35. finally
36. {
37. session.close(); 38. }
39.
40. //---------------------------------------------------
41.
42. // Session session = sessionFactory.openSession(); 43. // Transaction tx = null;
44. // Person person = null;
45. // try
46. // {
47. // tx =session.beginTransaction(); 48. // person =(Person)session.get(Person.class,"402881ec2ebd7e77
012ebd7e79e40001");
49. // tx.commit();
50. // }
51. // catch(Exception ex)
52. // {
53. // if(null != tx)
54. // {
55. // tx.rollback(); 56. // }
57. // }
58. // finally
59. // {
60. // session.close();
61. // }
62. // System.out.println(person.getName()); 63. // System.out.println(person.getIdCard().getNumber());
64.
65. //-----------------------------------------
66.
67. // Session session = sessionFactory.openSession(); 68. // Transaction tx = null;
69. //
70. // Person person = null;
71. // try
72. // {
73. // tx =session.beginTransaction(); 74. //
75. // person =(Person)session.get(Person.class,"402881ec2ebd7e77
012ebd7e79e40001");
76. //
77. // person.setName("lisi"); 78. // tx.commit();
79. // }
80. // catch(Exception ex)
81. // {
82. // if(null != tx)
83. // {
84. // tx.rollback();
85. // }
86. // }
87. // finally
88. // {
89. // session.close();
90. // }
91. // System.out.println(person.getName()); 92. //----------------------------------------- 93.
94. // Session session = sessionFactory.openSession(); 95. // Transaction tx = null;
96. // Person person = null;
97. // try
98. // {
99. // tx =session.beginTransaction(); 100. // person =(Person)session.get(Person.class,"402881ec2ebd7e7
7012ebd7e79e40001");
101. // session.delete(person); 102. // tx.commit();
103. // }
104. // catch(Exception ex)
105. // {
106. // if(null != tx)
107. // {
108. // tx.rollback();
109. // }
110. // }
111. // finally
112. // {
113. // session.close();
114. // }
通过执行查询,我们可以发现,hibernate的一对一默认执行的检
索方式是外连接检索方式,如果我们不想用外连接检索方式,我们可以
设置一下one-to-one的fetch属性,他有两个值,一个是select,一个
是jion。我想大家通过字面也能猜出他们所对应的检索方式。
Hibernate一对一中也可以设置延迟加载,一对一默认使用的是立即加载,如果需要使用延迟加载,那么需要在one-to-one元素中将constrained属性设为true,并且将待加载的一方的class元素中的lazy属性设为true(或者不去设置,因为该属性默认值就是true)。一对一加载时默认使用左外连接,可以通过修改fetch属性为select修改成每次发送一条select语句的形式。
唯一外键关联映射:其实它是一对多的特殊情况,它基本和一对多是完全相同的,只不过需要配置一个属性而已。其本质上是一对多的蜕化形式。在many-to-one元素中增加unique=”true”属性就变成了一对一。
二、一对唯一外键关联映射——单向
1.一对唯一外键关联映射是多对一关联映射的特例,可以采用标签,指定多的一端的unique=true,这样就限 制了多的一端的多重性为一,通过这种手段映射一对一唯一外键关联 2.领域模型图:
3.配置
Person.hbm.xml:
[html] view plaincopyprint?
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
IDCard.hbm.xml:
[html] view plaincopyprint?
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
三、 一对唯一外键关联映射——双向 1.一对一唯一外键关联双向,需要在另一端(idcard),添加
标签,指示hibernate如何加载其关联对象,默认根据主键加载person,
外键关联映射中,因为两个实体采用的是person的外键维护的关系,
所以不能指定主键加载person,而要根据person的外键加载,所以采
用如下映射方式:
2.领域模型图:
3.具体配置:
Person.hbm.xml:
[html] view plaincopyprint?
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
IDCard.hbm.xml
[html] view plaincopyprint?
1.
2.
3.
4.
5. 6.
7.
8.
9. 10.
11.
12.
13.
本文档为【hibernate一对一关系映射】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。