欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一对多关联映射(双向关联)见项目:me_one_to_many2

程序员文章站 2022-05-21 14:00:24
...

一对多双向关联映射的方法:
在"一"一端:
在集合标签里面使用<key>标签来表明需要在对方的表中添加一个外键指向"一"一端。

<set name="users" order-by="name" cascade="all" inverse="true">
<key column="groupid"/>
<one-to-many class="com.dvnchina.hibernate.User"/>
</set>

 
在"多"一端:
使用<many-to-one>标签来映射。name值需同实体类中的属性名一致。
<many-to-one name="group" column="groupid"/>
需要注意:<key>标签所指定的外键字段名需要与<many-to-one>标签定义的外键字段名一致,否则便会造成引用数据的丢失!
如果从"一"一端来维护一对多双向关联的关系,hibernate会发出多余的update语句,所以一般地情况下,我们便会从多一端来维护其关联关系!
关于inverse属性:
inverse属性可以被设置到集合标签<set>上,表示在存储双向一对多关联映射的时候,存储的是那一方的关联引用。默认情况下,inverse=“false”,所以,我们可以从一多端或者多一端来维护两者之间的关系;如果我们设置inverse=“true”,则只能通过多一端来维护两者之间的关系。inverse属性可以被用在一对多和多对多双向关联中;
外键不需写进实体类中,写实体类时,"多"的一端写一个"一"的实体属性,"一"的一端写一个"多"的集合属性。注意:inverse属性只是在将数据持久化到数据库的过程中发挥作用.如:
User.java

public class User {
private int id;
private String name;
private Group group;
}

 
Group.java

public class Group {
private int id;
private String name;
private Set Users;
}

 
Cascade与inverse解析:
cascade:关联表的连锁反应。
inverse:关联关系的控制方向。
在一对多双向关联映射中,它们都是在"一"的一端的set标签中设置,如在group.hbm.xml中设置:

<set name="users" order-by="name" cascade="all" inverse="true">
<key column="groupid"/>
<one-to-many class="com.dvnchina.hibernate.User"/>
</set>

 
cascade="all":当"一"端save-update-delete时,若多端为瞬时对象时,先save-update-delete"多"端,而不需多端为持久对象,若没此设置,当一端save-update-delete时所关联的多端必须为持久对象,否则抛出TransientObjectException。
inverse="true" :由于只能在”一”一端配置inverse,所以”一”一端将控制关系给"多"的一端,只能通过多一端来维护两者之间的关系。
由于一对多双向关联映射是和单向一对多,多对一的结合,这里就不在写例子了。

相关标签: Hibernate XML