首先inverse=”true”是在雙向關(guān)聯(lián)里面使用單向關(guān)聯(lián)沒有這個配置
inverse – 標(biāo)記由哪一方來維護關(guān)聯(lián)關(guān)系(雙向關(guān)聯(lián)中會用到)
inverse默認(rèn)值為false
如果inverse設(shè)置為true,表示將由對方維護兩者之間的關(guān)聯(lián)關(guān)系
舉例說明
OR映射文件
contactPerson映射文件
<class name="cn.com.leadfar.hibernate.ContactPerson" table="t_person" >
<id name="id">
<generator class="native"/>
</id>
<property name="name" />
<property name="address"/>
<property name="qq" />
<!-- 多對一這端gid要和一一端保持一致 如果不保持一致 指向group的一種引用-->
<many-to-one name="group" column="gid1"></many-to-one>
</class>
Group的相關(guān)配置文件
<class name="cn.com.leadfar.hibernate.Group" table="t_group" >
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- 沒有設(shè)置inverse=true表示任意一端管理都可以 -->
<!-- 設(shè)置inverse=true標(biāo)識強制一的一端管理他們的關(guān)聯(lián)關(guān)系 默認(rèn)是inverse=false的情況雙方都可以管理關(guān)聯(lián)關(guān)系 -->
<set name="persons" lazy="extra" >
<!-- 要跟多的一端gid保持一致 -->
<key column="gid2"></key>
<one-to-many class="cn.com.leadfar.hibernate.ContactPerson"/>
</set>
</class>
<set name="students“ lazy=“false” inverse=“true”>
<key column="classesid" ></key>
<one-to-many class=“cn.com.leadfar.Student" />
</set>
強制規(guī)定在對方去聯(lián)雙方的聯(lián)關(guān)系
Inverse=”false”表示雙方都可以管理這個關(guān)聯(lián)關(guān)系(缺省情況下)
配置文件
當(dāng)Inverse=”false”示例
代碼:
session.beginTransaction();
ContactPerson cp1 = new ContactPerson("爐小魚");
session.save(cp1);
ContactPerson cp2 = new ContactPerson("比爾蓋茨");
session.save(cp2);
ContactPerson cp3 = new ContactPerson("巴菲特");
session.save(cp3);
Group g1 =new Group("組0");
session.save(g1);
Group g2 = new Group("組1");
session.save(g2);
Group g3 = new Group("組3");
session.save(g3);
Set<ContactPerson> persons1 = new HashSet<ContactPerson>();
persons1.add(cp1);
persons1.add(cp2);
g1.setPersons(persons1);
Set<ContactPerson> persons2 = new HashSet<ContactPerson>();
persons2.add(cp3);
g3.setPersons(persons2);
session.getTransaction().commit();
輸出
由一的一端進行維護所有g(shù)id1就是null
//**************從多的一端和一的一端進行雙向管理他們的關(guān)聯(lián)關(guān)系****************************
session.beginTransaction();
ContactPerson cp1 = new ContactPerson("爐小魚");
session.save(cp1);
ContactPerson cp2 = new ContactPerson("比爾蓋茨");
session.save(cp2);
ContactPerson cp3 = new ContactPerson("巴菲特");
session.save(cp3);
Group g1 =new Group("組0");
g1.addPerson(cp1);
g1.addPerson(cp2);
session.save(g1);//g1變成了持久化對象狀態(tài),現(xiàn)在擁有了數(shù)據(jù)庫標(biāo)識
//還要建立
cp1.setGroup(g1);
cp2.setGroup(g1);
Group g2 = new Group("組1");
session.save(g2);////g2變成了持久化對象狀態(tài),現(xiàn)在擁有了數(shù)據(jù)庫標(biāo)識
Group g3 = new Group("組3");
g3.addPerson(cp3);
session.save(g3);////g3變成了持久化對象狀態(tài),現(xiàn)在擁有了數(shù)據(jù)庫標(biāo)識
cp3.setGroup(g3);
session.getTransaction().commit();
輸出
從一的一端去管理他們的關(guān)聯(lián)關(guān)系
//*****************從一的一端去關(guān)聯(lián)他們的關(guān)聯(lián)關(guān)系***************************
Group g1 = new Group("組0");
session.save(g1);
Group g2 = new Group("組1");
session.save(g2);
Group g3 = new Group("組3");
session.save(g3);
ContactPerson cp1 = new ContactPerson("爐小雨");
cp1.setGroup(g1);//建立關(guān)聯(lián)關(guān)系
session.save(cp1);
ContactPerson cp2 = new ContactPerson("比爾蓋茨");
cp2.setGroup(g1);//建立關(guān)聯(lián)關(guān)系
session.save(cp2);
ContactPerson cp3 = new ContactPerson("巴菲特");
cp3.setGroup(g3);//建立關(guān)聯(lián)關(guān)系
session.save(cp3);
輸出
以上就是inverse=”false”的情況下在多的一端和一的一端都可以管理他們的關(guān)聯(lián)關(guān)系
跟著給一的一端設(shè)置inverse=true
<class name="cn.com.leadfar.hibernate.Group" table="t_group" >
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- 沒有設(shè)置inverse=true表示任意一端管理都可以 -->
<set name="persons" lazy="extra" inverse="true" >
<!-- 要跟多的一端gid保持一致 -->
<key column="gid2"></key>
<one-to-many class="cn.com.leadfar.hibernate.ContactPerson"/>
</set>
</class>
繼續(xù)運行從多的一端運行的管理測試代碼
我們分析這段代碼
g1.addPerson(cp1); //如果在一的一端設(shè)置了inverse=true,那么這段代碼就沒有用了
g1.addPerson(cp2); //如果在一的一端設(shè)置了inverse=true,那么這段代碼就沒有用了,所以gid字段就為null了
cp1.setGroup(g1);//多的一端管理會起作用
cp2.setGroup(g1);//多的一端管理會起作用
只有這種方式的關(guān)聯(lián)才會是gid1有值
這就是inverse=-true帶給我們一個直觀的結(jié)果,設(shè)置inverse=true他將不再由一的一端去管理一和多之間的關(guān)聯(lián)關(guān)系
剛才字段設(shè)置成兩個是為了看的更清楚 設(shè)置了inverse=true表示哪個字段有值哪個字段沒有值會看的更清楚 如果你設(shè)置了inverset=true表示強制在哪一端管理他們的關(guān)聯(lián)關(guān)系 一般要設(shè)置字段保持一致
<class name="cn.com.leadfar.hibernate.ContactPerson" table="t_person" >
<id name="id">
<generator class="native"/>
</id>
<property name="name" />
<property name="address"/>
<property name="qq" />
<!-- 多對一這端gid要和一一端保持一致 如果不保持一致 指向group的一種引用-->
<many-to-one name="group" column="gid"></many-to-one>
</class>
<class name="cn.com.leadfar.hibernate.Group" table="t_group" >
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- 沒有設(shè)置inverse=true表示任意一端管理都可以 -->
<!-- 設(shè)置inverse=true標(biāo)識強制一的一端管理他們的關(guān)聯(lián)關(guān)系 -->
<set name="persons" lazy="extra" inverse="true" >
<!-- 要跟多的一端gid保持一致 -->
<key column="gid"></key>
<one-to-many class="cn.com.leadfar.hibernate.ContactPerson"/>
</set>
</class>
//沒有設(shè)置inverse="true"那么在更新一的一端的數(shù)據(jù)時
Group g = (Group) session.load(Group.class, 1);
System.out.println(g.getName());
g.setName("好朋友");
session.getTransaction().commit();
在多層應(yīng)用架構(gòu)里面 如果要更新一個對象 首先是要根據(jù)id查詢出來,將id對象顯示在更新界面里面 最后在提交到更新的action里面,說這個的意思是通常更新不是這樣去更新的 提交到后臺的更新action里面要new 模型 里面賦予相關(guān)的id值以及相關(guān)的屬性用這種方式來更新更加常見
ContactPerson cp1 = new ContactPerson();
cp1.setId(1);
cp1.setName("helloworld");
cp1.setAddress("平川");
cp1.setQq("3333222");
//這時更新gid會為null
session.update(cp1);
session.getTransaction().commit();
輸出:
session.beginTransaction();
ContactPerson cp1 = new ContactPerson();
cp1.setId(1);
cp1.setName("helloworld");
cp1.setAddress("平川");
cp1.setQq("3333222");
//這時更新gid會為null
//我們得記住他的關(guān)聯(lián)
Group g1 = new Group();
g1.setId(1);
cp1.setGroup(g1);
session.update(cp1);
輸出
session.beginTransaction();
Group g1 = new Group();
g1.setId(1);
g1.setName("朋友");
session.update(g1);
我很不希望這種情況發(fā)生,我們發(fā)現(xiàn)關(guān)聯(lián)丟失了如果這個關(guān)聯(lián)想要不丟失怎么辦呢?
最簡單的方式就是設(shè)置inverse=true
設(shè)置inverse=true的結(jié)果后
session.beginTransaction();
Group g1 = new Group();
g1.setId(1);
g1.setName("sb34朋友");
ContactPerson cp1 = new ContactPerson();
cp1.setId(1);
ContactPerson cp2 = new ContactPerson();
cp2.setId(2);
g1.addPerson(cp1);
g1.addPerson(cp2);
session.update(g1);
session.getTransaction().commit();
發(fā)現(xiàn)集合里面保存的東西我們是不管他的,所以inverse=true不管在這個集合里面有沒有數(shù)據(jù)
public class Group {
private int id;
private String name;
private Set<ContactPerson> persons = new HashSet<ContactPerson>();
在保存和更新的時候都不會去同步集合里面的數(shù)據(jù)就當(dāng)集合里面的數(shù)據(jù)不存在不管又還是沒有我都不管