免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
hibernate之inverse=true相關(guān)配置講解
 

首先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)系

Inverse=true 作用

剛才字段設(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ù)不存在不管又還是沒有我都不管

來源:https://www.icode9.com/content-4-511601.html
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Hibernate映射解析——七種映射關(guān)系(九)
一對一唯一外鍵關(guān)聯(lián)映射(雙向)
hibernate中inverse的用法
Java程序員從笨鳥到菜鳥之(五十四)細(xì)談Hibernate(五)Hibernate一對多關(guān)系映射
Hibernate映射 --- 一對一 ---- 共享主鍵的方式
Hibernate4實戰(zhàn) 之 第四部分:關(guān)系映射
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服