日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NHibernate学习笔记(转载):many-to-one/one-to-many/many-to-many关系映射

發布時間:2023/12/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NHibernate学习笔记(转载):many-to-one/one-to-many/many-to-many关系映射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

本文的內容:
  介紹NH如何處理對象間many-to-oneone-to-manymany-to-many的雙向映射關系(本文主要介紹了映射文件,對于類的生成可以跟據前兩篇描述的方法生成);

經驗教訓:

相關類圖:(下面的類圖包含一對一,多對一,一對多和多對多)
many-to-one
描述多對一的一種數據模型,它指定many一方是不能獨立存在的,我個人認為many-to-oneNHB中保證數據有效性的最有用的一種映射,通過使用many-to-one能有效的防治孤兒記錄被寫入到數據表中。在本文描述的例子中,Student類和Classes類之間是多對一關系.

  通過many-to-one元素,可以定義一種常見的與另一個持久化類的關聯。這種關系模型是多對一關聯。(實際上是一個對象引用。)在映射文件中用many-to-one標簽描述此種關系.

<many-to-one
????????
name="propertyName"(1)
????????column
="column_name"(2)
????????class
="ClassName"(3)
????????cascade
="all|none|save-update|delete"(4)
????????outer-join
="true|false|auto"(5)
????????update
="true|false"(6)
????????insert
="true|false"(7)
????????property-ref
="propertyNameFromAssociatedClass"?(8)
????????access
="field|property|ClassName"(9)
????????unique
="true|false"?(10)
/>

1.name:屬性名。指出many一方的類用哪個屬性和one一方的類關聯.
2.column:字段名(可選).指出many一方的類對應的數據表用哪個列和one一方的類對應的數據表關聯(兩表之間存在外鍵關聯);
3.class:關聯的類的名字(可選 - 默認是通過反射得到屬性類型);
4.cascade:指明哪些操作會從父對象級聯到關聯的對象(可選).cascade屬性允許下列值:: all, save-update, delete, none. 設置除了none以外的其它值會傳播特定的操作到關聯的(子)對象中。
5.outer-join:當設置hibernate.use_outer_join的時候,對這個關聯允許外連接抓取(可選 - 默認為auto).outer-join參數允許下列三個不同值: auto(使用外連接抓取關聯(對象),如果被關聯的對象沒有代理(proxy) ),true(一直使用外連接來抓取關聯),false(永遠不使用外連接來抓取關聯);
6.update,insert:指定對應的字段是否在用于UPDATE/INSERTSQL語句中包含。如果二者都是false,則這是一個純粹的外源性(derived關聯,它的值是通過映射到同一個(或多個)字段的某些其他屬性得到的,或者通過trigger(除法器),或者是其他程序(可選 - 默認為true
7.property-ref:指定關聯類的一個屬性,這個屬性將會和本外鍵相對應。如果沒有指定,會使用對方關聯類的主鍵(可選).property-ref屬性只應該用來對付老舊的數據庫系統,可能出現外鍵指向對方關聯表的是個非主鍵字段(但是應該是一個惟一關鍵字)的情況。這是一種十分丑陋的關系模型。比如說,假設Product類有一個惟一的序列號,它并不是主鍵;
8.accessNHibernate 用來訪問屬性的策略(可選 - 默認為property
9.unique:允許產生外鍵列唯一約束的數據庫定義語言(DDL)(可選)

那么關于Student的映射可能是:

<many-to-one?name="Classes"?column="cID"?unique?="true"/>

只要在原Student.hbm.xml映射文件中添加many-to-one標簽就可以了.

對于Sturent類得添加一個屬性Classes:Classes

one-to-many
一對多也是一種常見的數據模型,在按范式設計的數據庫中隨處可見。在NHB中通過one-to-many可以非常方便的處理這種模型,同時NHB還提供了級聯更新和刪除的功能,以保證數據完整性。在本文描述的例子中,Classes類和Student類是一對多的關系.

Classes
類的映射文件:Classes.hbm.xml

<?xml?version="1.0"?encoding="utf-8"??>
<hibernate-mapping?xmlns="urn:nhibernate-mapping-2.0">
??
<class?name="NHibernateTest.Classes,NHibernateTest"?table="Classes">
????
<id?name="ClassesID"?column="ID"?type="Int32"?unsaved-value="0">
??????
<generator?class="identity"/>
????
</id>
????
<property?name="ClassesName"?column="ClassName"?type="String"?length="50"/>

????
<bag?name="StudentList"?cascade="all"??inverse="true">
??????
<key?column="ID"?/>
??????
<one-to-many?class="NHibernateTest.Student,NHibernateTest"?/>
????
</bag>
??
</class>
</hibernate-mapping>

  如映射文件所示,one-to-many標簽必須包含在標簽bag中(個人理解:多嘛,就用一個包裝起來~)
??????? bag
標簽的name屬性指出Address對象用哪個屬性和Student對象關聯,inverse屬性使collection不更新連接(總之,這個屬性提高了性能,具體的情況請參考NHibernate的幫助文檔).
  key標簽的column屬性指出了Address對象對應的數據表用哪個字段和Student對象對應的數據表關聯
  one-to-many標簽的class屬性指出了Address和哪個對象關聯.

對于Classes類得創建一個StudentList : Student的屬性,用來描述與Student對象的關系.

many-to-many
多對多在數據庫中也是常見的數據模型,像用戶與組,用戶與權限等。多對多關系需要通過一個中間表實現,element的就是讀取這個中間表中某列的值。在本文的例子中,Student類和Subject類是多對多的關系.

  Student的映射可能是:

????<bag?name="SubjectList"?table="r_Student_Subject"?inverse="true"?cascade="save-update"?lazy="false">
??????
<key?column="StudentID"?/>
??????
<many-to-many?class="NHibernateTest.Subject,NHibernateTest"?column="ID"?outer-join="auto"?/>
????
</bag>

  在bag標簽中,加入了一個table屬性,它指定一個實現多對多的中間表

  完整的Student.hbm.xml源碼如下:

<?xml?version="1.0"?encoding="utf-8"??>
<hibernate-mapping?xmlns="urn:nhibernate-mapping-2.0">
??
<class?name="NHibernateTest.Student,NHibernateTest"?table="Users">
????
<id?name="UserID"?column="ID"?type="Int32"?unsaved-value="0">
??????
<generator?class="identity"/>
????
</id>
????
<property?name="UserName"?column="UserName"?type="String"?length="20"/>
????
<property?name="Password"?column="Password"?type="String"?length="20"/>

????
<!--Student
類和NativePlace類是一對一的關系-->
????
<one-to-one?name="NativePlace"?class="NHibernateTest.NativePlace,NHibernateTest"?cascade="all"?/>

????
<!--Student類和Classes類是多對一的關系-->
????
<many-to-one?name="Classes"?column="cID"?unique?="true"/>

????
<!--Student類和Address類是一對多的關系-->
????
<bag?name="AddressList"?cascade="all"??inverse="true">
??????
<key?column="ID"?/>
??????
<one-to-many?class="NHibernateTest.Address,NHibernateTest"?/>
????
</bag>

????
<!--Student類和Subject類是多對多的關系-->
????
<bag?name="SubjectList"?table="r_Student_Subject"?inverse="true"?cascade="save-update"?lazy="false">
??????
<key?column="StudentID"?/>
??????
<many-to-many?class="NHibernateTest.Subject,NHibernateTest"?column="ID"?outer-join="auto"?/>
????
</bag>
??
</class>
</hibernate-mapping>

  Student類得添加類型為IList的屬性SubjectList表示與類Subject的關系.

  由于Student的映射關系比較復雜,本文就再熬述它的CRUD操作,具體的操作方法請參考本文附帶的代碼.

轉載于:https://www.cnblogs.com/zhl7522/archive/2007/10/25/937161.html

總結

以上是生活随笔為你收集整理的NHibernate学习笔记(转载):many-to-one/one-to-many/many-to-many关系映射的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。