Nhibernate多對多對映

2022-01-11 14:54:30 字數 4071 閱讀 5760

一般來說多對多對映,對映表不需要設定為實體類,但如果特殊需求,如需要新增欄位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的配置有一定大了解,在實際開發中還有一種對映關係就是多對多對映,比如乙個公司中開發人員和專案之間就是多對多的關係,乙個開發人員可以同時參與幾個專案,當然乙個專案可以有多個人員參與。首先就是在資料庫中建立三張表,除了本來的雇員表和專案表外,另外一張表來儲存兩者...