NHibernate多對一xml映射-NHibernate入門到精通系列7

NHibernate開發中的NHibernate多對一xml映射,和數據庫開發是相離不開的,只是中間多了一層Xml映射。

我們想一下,在數據庫中,多對一的情況,即是外建和主鍵的關係,這種情況是很常見的,那如何在NHibernate中來表示多對一的關係呢?

繼上節實體與數據庫的Xml映射標籤-NHibernate入門到精通系列6的內容,我們來看一下如何實現多對一的Xml映射:

一、NHibernate多對一關聯映配置

<many-to-one
name="PropertyName"                                實體屬性名
column="column_name"                               數據庫字段名
class="ClassName"                                  NHibernate關聯的類名
cascade="all|none|save-update|delete"              級聯關係
fetch="join|select"                                批次讀取
update="true|false"                                啓用更新
insert="true|false"                                啓用插入
property-ref="PropertyNameFromAssociatedClass"     指定關聯類的一個屬性,這個屬性將會和本外鍵相對應
access="field|property|nosetter|ClassName"        
unique="true|false"                                啓用生成唯一約束
optimistic-lock="true|false"                      
not-found="ignore|exception"                       數據不存在,忽略還是拋異常。
  />

二:NHibernate多對一關的概念介紹

我們先看一張圖片:


本圖中:學生表有兩條記錄,它們分別對應了班級表的主鍵值爲“1”的同一條記錄。

所以這就是“多對一”的使用情景。


三:NHibernate多對一關聯映射插入和查詢示例

先來段示例代碼:

        public void Save()
        {
            using (ISession session = this.sessionFactory.OpenSession())
            {
                var cls = new Class { Name = "2班" };

                var liu = new Student { Name = "小冬", Class = cls };
                var zhang = new Student { Name = "小三", Class = cls };

                ITransaction tran = session.BeginTransaction();
                try
                {
                    //持久化“Class”類
                    session.Save(cls);

                    session.Save(liu);
                    session.Save(zhang);

                    tran.Commit();
                }
                catch(Exception ex)
                {
                    tran.Rollback();
                    throw ex;
                }
            }
        }
運行後如下圖:

這裏提示一下:

如果發現拋出“object references an unsaved transient instance - save the transient instance before flushing. Type: Domain.Class, Entity: Domain.Class”這樣的異常。

原因可能是:持久化Student類的實例後,Student類的實例變爲持久態(Persistent),而Class類的實例還是臨時態(Transient),當持久化一個持久態的實例時,若該實例引用了一個臨時態的實例,就會拋出這樣的異常。

本節簡單介紹到這裏,免的介紹的太複雜,大夥學習起來看似頭痛,如想學習更復雜的操作,也可以相關百度google,從中追尋更多的知識面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章