Nhibernate基礎 在 NHibernate 中一切必須是 Virtual 的嗎? NHibernate主鍵生成方式 Key Generator NHibernate的Session管理策略

 

Nhibernate(英文冬眠的意思) 經常使用方法html

 

Contains java

Evictweb

Clearsql

 在 NHibernate 中一切必須是 Virtual 的嗎?

 http://www.cnblogs.com/aaa6818162/p/4675279.html數據庫

http://blog.zhaojie.me/2009/09/my-view-of-nhibernate-2-virtually-everything.html緩存

所以,若是是你的話,在寫Java代碼的時候,是願意使用getXxx()這樣的方法,仍是直接訪問類中的私有字段?所以我認爲,是Java語言的特性,致使Java開發人員傾向於直接訪問類中的私有字段,從而致使Hibernate須要避免未加載的私有字段,進一步致使Hibernate的代理類會去覆蓋全部的公開方法(只有方法,由於Java語言沒有「屬性」)——最終,因爲NHibernate在「統一大業」上的策略,使得咱們.NET開發人員也必須把全部成員標記爲virtual,不管是方法仍是屬性。安全

 

 Nhibernate API

 

http://www.cnblogs.com/aaa6818162/p/4639308.htmlsession

 

下圖描述了NHibernate的API在分層架構中的做用,下面將進行詳細說明。多線程

image 

NHibernate的接口大體分爲四類:架構

1.  被應用程序調用進行基本數據操做(增、刪、改、查)的接口。這些接口是應用程序的業務邏輯層和控制層與NHibernate的主要交互點。ISession, ITransaction, IQuery和ICriteria屬於此類。

2. 被應用程序用來配置NHibernate的接口。Configuration就屬此類。

3. 回調接口。應用程序用回調接口來響應NHibernate中觸發的事件。這類接口包括Interceptor, ILifecycle和IValidatable等。

4. 用於擴展NHibernate的強大映射功能的接口。這類接口一般被應用程序的基礎架構來實現。IUserType, ICompositeUserType, 和IIdentifierGenerator屬於此類。

 NHibernate Interceptor機制

 nhibernate是如何自動生成sql語句的

NHibernate 查看生成的sql語句:
其實就是Interceptor的應用,  源碼中Interceptor的默認實現是EmptyInterceptor,
[Serializable]
public class EmptyInterceptor : IInterceptor
{   //前面省略n行代碼
  public SqlString OnPrepareStatement搜索(SqlString sql)
  {
   return sql;
  }
}  public class MyInterceptor : EmptyInterceptor
    {
       public override NHibernate.SqlCommand.SqlString OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
        {
            return base.OnPrepareStatement(sql);
        }
    } 咱們要作的就是繼承EmptyInterceptor,重寫OnPrepareStatement()方法,重寫方法裏面就是你大展拳腳的地方了,
想寫文件寫文件,想輸出到頁面就輸出到頁面,什麼都不作均可以,如上
怎麼用呢?
  public override void Update(Admin entity)
        {
            ISession session = HibernateTemplate.SessionFactory.OpenSession(new MyIntercepotr);
            session.Update(entity);
            session.Flush();
        }
在你想要查看的操做中,打開session 的時候添加上自定義的攔截器就能夠了,想給全部的操做都配置的話就要用到全局配置文件了。
重寫OnPrepareStatement()的時候一句話都不改,我只是在這裏打一個斷點而已,只要看看生成的sql語句就好了,而後去修改配置文件再來debug,確認怎麼配置生產的sql最優。

 

http://www.cnblogs.com/jiezhi/articles/87414.html

http://www.cnblogs.com/JeffreyZhao/archive/2009/10/13/my-view-of-nhibernate-4-interceptor.html

 NHibernate中Session是線程不安全(多線程中Session不能被共享)  http://www.cnblogs.com/aaa6818162/p/4631412.html
 Nhibernate 設置派生屬性

 http://www.cnblogs.com/cnjava/archive/2012/07/21/2602294.html

 

映射屬性

做用

<property>元素的insert屬性

若是爲false,在insert語句中不包含該字段,代表該字段永遠不能被插入。默認值爲true

<property>元素的update屬性

若是爲false,update語句中不包含該字段,代表該字段永遠不能被更新,默認值爲true

<class>元素的mutable屬性

若是爲false,等價於全部的<property>元素的update屬性爲false,表示整個實例不能被更新,默認值爲true

<property>元素的dynamic-insert屬性

若是爲true,表示當保存一個對象時,會動態生成insert語句,只有這個字段取值不能爲null,纔會把它包含到insert語句中。默認值爲false

<property>元素的dynamic-update屬性

若是爲true,表示當更新一個對象時,會動態生成update語句,只有該字段取值不爲null,纔會把它包含到update語句中。默認值爲false

<class>元素的dynamic-insert屬性

若是爲true,等價於全部的<property>元素的dynamic-insert屬性爲true,表示當保存一個對象時,會動態生成insert語句,insert語句中僅包含全部取值不爲null的字段。默認值爲false

<class>元素的dynamic-update屬性

若是爲true,等價於全部的<property>元素的dynamic-update屬性爲true,表示當保存一個對象時,會動態生成update語句,update語句中僅包含全部取值不爲null的字段。默認值爲false

 

 

NHibernate主鍵生成方式   Key Generator

 關係數據庫中的主鍵可分爲 天然主鍵(具備業務含義)和代理主鍵(不具備業務含義)
 Nhibernate鎖 數據併發 版本號   http://www.cnblogs.com/lyj/archive/2008/10/21/1316269.html

 

Nhibernate 一級緩存

 
 NHibernate的Session管理策略   http://www.cnblogs.com/13yan/archive/2013/05/17/3083552.html

1)在Web應用程序中 一個請求中第一次會打開一個Session並保存再web上下文,之後就再也不新打開了

2)在WinForm或單元測試中,使用另外一種策略,每一個線程用一個Session。

修改hibernate.cfg.xml配置文件,加入一個屬性<property name="current_session_context_class">web</property>,修改這個屬性就能夠修改Session策略。

sessionFactory = new Configuration().Configure()
                .SetProperty("current_session_context_class", currentSessionContextClass.ToString())
                .BuildSessionFactory();

 NHibernate 怎麼樣去爲咱們的實體類設置一個通用的基類   http://www.cnblogs.com/aaa6818162/p/4631443.html
 hibernate session的flushMode的區別 

  

http://blog.csdn.net/looyo/article/details/6309136

 

http://stackoverflow.com/questions/3295169/nhibernate-flushmode-auto-not-flushing-before-find

 

session.flushmode=auto
1.手動調用flush()
2.commit()時候
3.查詢前 (通過測試(oracle驅動),必須在事務內,不肯定是否所有情形)

 

 

/// <summary>
        ///  FlushMode.Auto  entity2返回值  list返回值
        /// FlushMode.Commit entity2 null  list null
        /// 調用Session的查詢方法時,清理緩存,注意:這條規則必須保證顯式開啓的事務中,對於outside a transaction
        /// </summary>
        /// <returns></returns>
        public void FlushModeAutoTestMethod3()
        {
            ISession session = SessionFactoryManager.SessionFactory.OpenSession();
            session.FlushMode = FlushMode.Commit;
            var tx = session.BeginTransaction();
            Cardtype entity = new Cardtype() { Cardtypename = "33" };
            session.Save(entity);

 

            Cardtype entity2 = session
                    .CreateQuery("from Cardtype where Cardtypename = '33'")
                    .List<Cardtype>()
                    .FirstOrDefault();

 

            entity.Cardtypename = "66";
            var list = session.CreateQuery("from Cardtype where Cardtypename = '66'").List<Cardtype>().Count();
            session.Flush();
            tx.Commit();
        }

 

 

 NHibernate中Get和Load的區別  1.get()採用當即加載方式,而load()採用延遲加載;

  get()方法執行的時候,會當即向數據庫發出查詢語句,
   而load()方法返回的是一個代理(此代理中只有一個id屬性),只有等真正使用該對象屬性的時候,纔會發出sql語句
2.若是數據庫中沒有對應的記錄,get()方法返回的是null.而load()方法出現異常ObjectNotFoundException

若是加載一個對象的目的是威力訪問它的屬性,能夠用get方法

若是加載一個對象的目的是爲了刪除它,或者是爲了創建於別的對象的關聯,能夠用load


 域對象在持久化層的三種狀態   

臨時狀態(Transient):當new一個實體對象後,這個對象處於臨時狀態,即這個對象只是一個保存臨時數據的內存

 區域,若是沒有變量引用這個對象,則會被jre垃圾回收機制回收。這個對象所保存的數據

 與數據庫沒有任何關係,除非經過Session的save或者SaveOrUpdate把臨時對象與數據庫

 關聯,並把數據插入或者更新到數據庫,這個對象才轉換爲持久對象。

 

持久狀態(Persistent): 持久化對象的實例在數據庫中有對應的記錄,並擁有一個持久化表示(ID)。對持久化對

象進行delete操做後,數據庫中對應的記錄將被刪除,那麼持久化對象與數據庫記錄再也不

存在對應關係,持久化對象變成臨時狀態。持久化對象被修改變動後,不會立刻同步到數

據庫,直到數據庫事務提交。在同步以前,持久化對象是髒的(Dirty)。

 

遊離狀態(Detached):當Session進行了Close、Clear或者evict後,持久化對象雖然擁有持久化標識符和與數據

庫對應記錄一致的值,可是由於會話已經消失,對象不在持久化管理以內,因此處於遊離

狀態(也叫:脫管狀態)。遊離狀態的對象與臨時狀態對象是十分類似的,只是它還含有

持久化標識。

 

總結:咱們如今系統默認取出來的對象一直在持久狀態 由於session綁定的web上線文  只有請求結束才進行session的close

 protected void Application_BeginRequest(object sender, EventArgs e)
        {
            ISession session = SessionFactoryBizCom.GetInstance().OpenSession();
            session.FlushMode = FlushMode.Auto;
            CurrentSessionContext.Bind(session);
        }

        protected void Application_EndRequest(object sender, EventArgs e)
        {
            if (CurrentSessionContext.HasBind(SessionFactoryBizCom.GetInstance().GetessionFactory()))
            {
                ISession session = CurrentSessionContext.Unbind(SessionFactoryBizCom.GetInstance().GetessionFactory());
                //session.Flush();
                //session.Close();
                session.Dispose();
            }
        }

相關文章
相關標籤/搜索