这些天学习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时能够获取到集合里面的内容的大小,有知道怎么回事的大侠路过,请给解惑一下