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

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值