hibernate配置文件中有這么一個屬性inverse,它是用來指定關聯的控制方的。
inverse屬性默認是false,若為false,則關聯由自己控制,若為true,則關聯
由對方控制。
見例子:
一個Parent有多個Child,一個Child只能有一個Parent。
package com.xian;
public class Child {
?private Long id;
?private String name;
?private Parent parent;
?public Long getId() {
??return id;
?}
?public void setId(Long id) {
??this.id = id;
?}
?public String getName() {
??return name;
?}
?public void setName(String name) {
??this.name = name;
?}
?public Parent getParent() {
??return parent;
?}
?public void setParent(Parent parent) {
??this.parent = parent;
?}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
?<class name="com.xian.Child" table="child">
??<id name="id" column="childId">
???<generator class="native" />
??</id>
??<property name="name" type="string"></property>
??<many-to-one name="parent" column="parentId" not-null="true">
??</many-to-one>
?</class>
</hibernate-mapping>
package com.xian;
import java.util.HashSet;
import java.util.Set;
public class Parent {
?private Long id;
?private String name;
?private Set children = new HashSet();
?public Long getId() {
??return id;
?}
?private void setId(Long id) {
??this.id = id;
?}
?public String getName() {
??return name;
?}
?public void setName(String name) {
??this.name = name;
?}
?public Set getChildren() {
??return children;
?}
?public void setChildren(Set children) {
??this.children = children;
?}
?
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
?<class name="com.xian.Parent" table="parent">
??<id name="id" column="parentId">
???<generator class="native"></generator>
??</id>
??<property name="name" type="string"></property>
??<set name="children" inverse="true">
??<!-- 此處inverse設置為true,則關聯的控制方交給了child,一對多關聯一般都將控制方交給多端 -->
???<key column="parentId" not-null="true"></key>
???<one-to-many class="com.xian.Child"/>
??</set>
?</class>
</hibernate-mapping>
Parent p = new Parent();
p.setName("parent");
Child c = (Child) session.load(Child.class, 4l);? //原child表中已存在id=4的child
p.getChildren().add(p);??// 我希望用parent端來修改關聯,即將id=4的child的外鍵變為現在這個parent的主鍵值
session.save(p);?//這里保存parent,同時希望關聯也得到修改
但是我們發現parent確實保存了,而child的外鍵還是原值,沒有關聯到我們現在的外鍵
原因就是我們將關聯的控制方交給了child端,這樣一來parent就不能夠控制關聯了。
Parent p = new Parent();
p.setName("parent");
Child c = (Child) session.load(Child.class, 4l);
c.setParent(p);?? //這樣由child端修改關聯就ok了?
session.save(p);