Hibernate双向一对一,一对多,多对多关系映射

时间:2022-03-05 11:54:58

这些天学习hibernate表关联关系时有点搞混了,抽点时间捋一捋

1.双向一对多:

外键关联:

多的一端添加外键引用一的一端的id ;

在配置文件Student

<span style="font-size:18px;"> <span style="white-space:pre"></span><strong><many-to-one name="<span style="color:#cc0000;">teacher</span>" class="net.zjl.po.Teacher" fetch="join" lazy="false">
<column name="<span style="color:#cc0000;">teacher</span>" />
</many-to-one></strong></span>
<span style="font-size:18px;"><strong><many-to-one>里面的name是po里面的属性,</strong></span><pre name="code" class="html"><span style="font-size:18px;"><strong> <column >里面的name是数据库字段,是外键引用,对应</strong></span><pre name="code" class="html"><span style="font-size:18px;"><strong>teacher表中的ID</strong></span>

 
 
fetch是抓取数据的方式,参数值有,select,join,区别在于select不会取出关联的数据,再用到时会再发出一条HQL语句,而join是外连接直接取出关联的数据。用到时不会在发出HQL语句了。可以再配置文件中设置show_sql查看控制台输出的HQL语句,当选上fetch=join的时候懒加载lazy就失效了,即自动为FALSE了。

在一的一端要配置一对多 Teacher:

<span style="font-size:18px;"> <strong><span style="white-space: pre;"></span><set name="students" inverse="true" table="student"  cascade="save-update" fetch="join" la<span style="white-space:pre"></span>zy="false">
<key> <column name="teacher" /></key>
<one-to-many class="net.zjl.po.Student" />
</set></strong></span>
<span style="font-size:18px;"><strong><set>里面的students即为TeacherPO类里面的集合属性名,inverse是关联关系由谁来维护</strong></span>
<span style="font-size: 18px;"><strong>true  是由多的一方维护,FALSE是一的一方来维护,考虑效率一般设为true;</strong></span>
<span style="font-size: 18px;"><strong>cascade 有all,save-update,delete,代表级联操作,根据英文意思也可以明白,就是什么时候级联操作</strong></span>
<span style="font-size: 18px;"><strong>all是所有,delete是删除时,save-update是保存和更新时,一般选取save-update就够用了。</strong></span>
<span style="font-size: 18px;"><strong></strong></span><pre name="code" class="html"><span style="font-size:18px;"><strong><key>是对应的被引用的外键,在学生表里面的字段,和多的一方<column>里面的name是同一个字段</strong></span><pre name="code" class="html" style="font-size: 18px; font-weight: bold;"><one-to-many>里面的class即为对应的关联类

 
 
2.双向多对多配置: 

看完一对多,再看多对多,

其实就是两个一对多就成了多对多了N -> 1:1 <- N

就是引入一个中间表,有两个外键,分别是两张表的主键ID,然后再两个PO类中加上一个集合属性:Person.hbm.xml

<strong><class name="Person" table="student" catalog="test">
<id name="id" type="integer">
<column name="id"/>
<generator class="native"/>
</id>
<set name="addresses" table="person_address" catalog="acesys">
<key>
<column name="person_id" not-null="true" />
</key>
<many-to-many class="net.dqsy.po.Address">
<column name="address_id" not-null="true" />
</many-to-many>
</set>
</class></strong>
<strong>① name:集合属性的名称。② table:中间关系表的名称。③ key元素的column子元素:用于指定本表在中间表的外键列。④ many-to-many :指明了一个多对多的关联,用以映射到关联类属性。entity-name指定关联的持久化类名,</strong>
<strong>column指关联类表在中间表的外键列</strong>
Address.hbm.xml

<strong><class name="Address" table="address" catalog="test">
<id name="id" type="integer">
<column name="id"/>
<generator class="native"/>
</id>

<set name="persons" inverse="true" table="person_address" catalog="acesys">
<key>
<column name="address_id" not-null="true" />
</key>
<many-to-many class="net.dqsy.po.Person">
<column name="person_id" not-null="true" />
</many-to-many>
</set>
</strong>
<strong></class></strong>
3.双向一对一配置;

基于外键不是主键的配置,跟一对多相似只是在many-to-one里面添加上unique=true

<strong><many-to-one name="person" class="net.zjl.po.Teacher" fetch="select" unique="true" >
<column name="t_id" />
</many-to-one></strong>

一的一方:

<strong> <one-to-one name="student" ></one-to-one></strong>
还有一个问题没有解决:

还有,就是一对多的时候,set集合里面添加成功以后数据库里面并没有显示数据,但是在调用getStudents时能够获取到集合里面的内容的大小,有知道怎么回事的大侠路过,请给解惑一下


Hibernate双向一对一,一对多,多对多关系映射