Hibernate學習

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(c);  // 我希望用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);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章