一般來說多對多對映,對映表不需要設定為實體類,但如果特殊需求,如需要新增欄位isactived等,這個時候就需要將對映表設定為實體,同時該實體需要針對兩邊的類做many-to-one對映,而兩邊的類需要做來實現雙向關聯,如下例:
需求:系統需要對私人(accountinfo)傳送短訊息(message),同時要統計短訊息閱讀狀態(isreaded),這時資料表設計如下:
首先是實體類的設計:
a.message類
1///
2///
訊息持久類
3///
4[serializable]
5public
class
message : messagebase611
}message對映檔案
1xml version="1.0" encoding="utf-8"
?>
2<
xmlns
assembly
="ybvalidator.infrastructure.core"
namespace
="ybvalidator.infrastructure.core"
>
3<
class
name
="ybvalidator.infrastructure.core.message"
table
="message"
>
4<
id name
="id"
column
="msgid"
type
="int"
>
5<
generator
class
="native"
>
generator
>6id
>78
<
property
name
="title"
column
="title"
type
="string"
/>
9<
property
name
="inputdate"
column
="inputdate"
type
="datetime"
/>
10<
property
name
="content"
column
="msgcontent"
type
="string"
/>
1112
13<
many-to-one
name
="user"
column
="username"
not-null
="true"
14foreign-key
="fk_message_userinfo"
15>
many-to-one
>
1617
18<
bag
name
="accounts"
cascade
="all"
inverse
="true"
>
19<
key
column
="msgid"
>
key>
20<
one-to-many
class
="accountmessage"
/>
21bag
>
22class
>
23>
b.accountmessage類
1[serializable]
2public
class
accountmessage : entity35
6public
virtual
bool
isreaded 78
public
virtual
message message 910
public
virtual
accountinfo account 11}
accountmessage對映檔案
1xml version="1.0" encoding="utf-8"
?>
2<
xmlns
assembly
="ybvalidator.infrastructure.core"
namespace
="ybvalidator.infrastructure.core"
>
3<
class
name
="ybvalidator.infrastructure.core.accountmessage"
table
="accountmessage"
dynamic-insert
="true"
dynamic-update
="true"
>
4<
id name
="id"
column
="id"
type
="int"
>
5<
generator
class
="native"
>
generator
>6id
>
7<
property
name
="isreaded"
column
="isreaded"
>
property
>89
1011
<
many-to-one
class
="message"
name
="message"
foreign-key
="fk_accountmessage_message"
column
="msgid"
>
many-to-one
>
1213
<
many-to-one
class
="accountinfo"
name
="account"
foreign-key
="fk_accountmessage_accountinfo"
column
="accname"
>
many-to-one
>
14class
>
15>
如上所示,在對映類(accountmessage)中對兩邊的類(message、accountinfo)做兩個many-to-one對映,而在兩邊的類(以message為例),需要做乙個one-to-many的對映來實現雙相關聯
使用的時候就有點麻煩:
1ilist
<
accountmessage
>
accountmessages
=new
list
<
accountmessage
>
();2
//獲取type相同的所有帳戶
3var accountinfos
=accountinfofacade.getaccountlistbyshoptype(type);4//
遍歷帳戶設定設定accountmessage
5foreach
(var accountinfo
inaccountinfos)6);
12}1314
15message.accounts
=accountmessages;
NHibernate一對多對映儲存資料
iset集合中,每個物件唯一。在nhibernate中,在父類中對應子類的iset集合時,因為set類為抽象類,所以不能例項化set類。isetlist new set 將報 無法建立抽象類或介面 iesi.collections.generic.set 的例項 錯誤。hashedset繼承於dic...
Nhibernate中一對多對映 雙向關聯
雙向關聯和單向關聯的區別是 兩邊都能維護關係,如我查詢兩邊的任何一邊,另外一邊的資訊也能查詢出來,其他的修改刪除只要設定了,也都可以。體現在 中是 因為上篇單向關聯是在dictionaryentity上,所以變為雙向關聯要在dictiontypeentity和他對應的xml檔案中加上關聯對映。dic...
hibernate高階 多對多對映
前面學習了一對多對映,對hibernate的配置有一定大了解,在實際開發中還有一種對映關係就是多對多對映,比如乙個公司中開發人員和專案之間就是多對多的關係,乙個開發人員可以同時參與幾個專案,當然乙個專案可以有多個人員參與。首先就是在資料庫中建立三張表,除了本來的雇員表和專案表外,另外一張表來儲存兩者...