1. 程式人生 > >在 Hibernate 中inverse的屬性

在 Hibernate 中inverse的屬性

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的childp.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);

Inverse和cascade是Hibernate對映中最難掌握的兩個屬性。兩者都在物件的關聯操作中發揮作用。

1.明確inverse和cascade的作用 inverse 決定是否把對物件中集合的改動反映到資料庫中,所以inverse只對集合起作用,也就是隻對one-to-many或many-to-many有效(因 為只有這兩種關聯關係包含集合,而one-to-one和many-to-one只含有關係對方的一個引用)。 cascade決定是否把對物件的改動反映到資料庫中,所以cascade對所有的關聯關係都起作用(因為關聯關係就是指物件之間的關聯關係)。

2.inverse屬性 :inverse所描述的是物件之間關聯關係的維護方式。 inverse只存在於集合標記的元素中 。Hibernate提供的集合元素包括<set/> <map/> <list/> <array /> <bag /> Inverse屬性的作用是:是否將對集合物件的修改反映到資料庫中。 inverse屬性的預設值為false,表示對集合物件的修改會被反映到資料庫中;inverse=false 的為主動方,由主動方負責維護關聯關係。