hibernate many-to-one 一些屬性說明(outer-join)
many-to-one:描述多對一的一種資料模型,它指定many一方是不能獨立存在的,我個人認為many-to-one是NHB中保證資料有效性的最有用的一種對映,通過使用many-to-one能有效的防治孤兒記錄被寫入到資料表中。在本文描述的例子中,Student類和Classes類之間是多對一關係.
通過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(永遠不使用外連線來抓取關聯).
true: 表示使用外連線抓取關聯的內容,這裡的意思是當使用load(OrderLineItem.class,"id")時,Hibernate只生成一條SQL語句將OrderLineItem與他的父親Order全部初始化。
select * from OrderLineItem o left join Order p on o.OrderId=p.OrderId where o.OrderLineItem_Id=?
false:表示不使用外連線抓取關聯的內容,當load(OrderLineItem.class,"id")時,Hibernate生成兩條SQL語句,一條查詢OrderLineItem表,另一條查詢Order表。這樣的好處是可以設定延遲載入,此處要將Order類設定為lazy=true。
select * from OrderLineItem o where o.OrderLineItem_Id=?
select * from Order p where p.OrderId=?
auto:具體是ture還是false看hibernate.cfg.xml中的配置
注意:如果使用HQL查詢OrderLineItem,如 from OrderLineItem o where o.id='id',總是不使用外部抓取,及outer-join失效。
由於集合可以設定lazy="true",所以lazy與outer-join不能同時為true,當lazy="true"時,outer-join將一直是false,如果lazy="false",則outer-join用法與1同
;
6.update,insert:指定對應的欄位是否在用於UPDATE
和/或 INSERT
的SQL語句中包含。如果二者都是false
,則這是一個純粹的“外源性(derived)”關聯,它的值是通過對映到同一個(或多個)欄位的某些其他屬性得到的,或者通過trigger(除法器),或者是其他程式(可選 - 預設為 true
)
7.property-ref:指定關聯類的一個屬性,這個屬性將會和本外來鍵相對應。如果沒有指定,會使用對方關聯類的主鍵(可選).property-ref屬性只應該用來對付老舊的資料庫系統,可能出現外來鍵指向對方關聯表的是個非主鍵欄位(但是應該是一個惟一關鍵字)的情況。這是一種十分醜陋的關係模型。比如說,假設Product類有一個惟一的序列號,它並不是主鍵;
8.access:NHibernate 用來訪問屬性的策略(可選 - 預設為property
)
9.unique:允許產生外來鍵列唯一約束的資料庫定義語言(DDL)(可選)
那麼關於Student的對映可能是:
只要在原Student.hbm.xml對映檔案中新增many-to-one標籤就可以了.
對於Sturent類得新增一個屬性Classes:Classes
one-to-many:一對多也是一種常見的資料模型,在按正規化設計的資料庫中隨處可見。在NHB中通過one-to-many可以非常方便的處理這種模型,同時NHB還提供了級聯更新和刪除的功能,以保證資料完整性。在本文描述的例子中,Classes類和Student類是一對多的關係.
Classes類的對映檔案:Classes.hbm.xml
<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的對映可能是:
<key column="StudentID" />
<many-to-many class="NHibernateTest.Subject,NHibernateTest" column="ID" outer-join="auto" />
</bag>
在bag標籤中,加入了一個table屬性,它指定一個實現多對多的中間表
完整的Student.hbm.xml原始碼如下:
<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的關係.
相關文章
- Vue元件中prop屬性使用說明Vue元件
- ECSide標籤屬性說明之IDE
- Oracle 資料檔案 reuse 屬性 說明Oracle
- delphi 常用控制元件屬性設定說明控制元件
- Hibernate常用API以及使用說明API
- hibernate中many-to-one的查詢最佳化
- flutter 學習筆記【flutter 構造方法 TextField 屬性說明】Flutter筆記構造方法
- ASP.NET的Page.IsPostBack 屬性詳細說明(轉)ASP.NET
- Hibernate的generator屬性之意義(轉)
- 關於hibernate的hibernate.hbm2ddl.auto屬性
- Mysql的read_only 只讀屬性說明 (運維筆記)MySql運維筆記
- oracle jdbc jar 的一些說明OracleJDBCJAR
- Hibernate級聯關係的說明和優化優化
- 對Mysql中的read_only 只讀屬性做簡要說明MySql
- 說說如何使用 Python 類的屬性Python
- 一些常用的模型屬性模型
- 一些少見的 Swift 屬性Swift
- Hibernate 對映xml中的屬性型別XML型別
- 一些網路協議的說明協議
- BRDF能量守恆屬性的證明
- 細說軟體質量屬性
- 前端常用的一些meta屬性前端
- Hibernate【inverse和cascade屬性】知識要點
- OGG工作原理及一些配置說明
- rac後臺程式說明及一些概念
- Hibernate annotation, JPA如何對映多個屬性為unique
- Ext 佈局的一些配置屬性
- GridView的一些特殊屬性(未完)View
- 一些超級好用的CSS 屬性CSS
- OGG一些引數說明,帶翻譯!
- sift和surf演算法的一些說明演算法
- iOS開發中一些常用的屬性iOS
- 關於 UiPath Activities 中文手冊的一些說明UI
- 關於python類屬性和例項屬性的一些細節注意點Python
- IOS開發:Swift中附屬指令碼的使用說明iOSSwift指令碼
- 獲取淘寶商品詳情api、介面獲取寶貝詳情、產品詳細屬性示例說明API
- 思科路由器安全性與可靠性詳細說明路由器
- CMake 屬性之全域性屬性