一对多双向关联映射的方法:
在"一"一端:
在集合标签里面使用<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,所以”一”一端将控制关系给"多"的一端,只能通过多一端来维护两者之间的关系。
由于一对多双向关联映射是和单向一对多,多对一的结合,这里就不在写例子了。