使用

2

我有這種情況:使用

我使用NHibernate映射一個實體「用戶」這是在SQL中的大表映射,爲性能比較的原因我已經創建了一個輕量級的實體「LightweightUser」具有特性的只有一小部分是不是,我使用的是NHibernate的投影技術接線「LightweightUser」實體在HBM文件或任何映射。兩個實體都派生自一個簡單的類「實體」,其中包含一個Id屬性。

上面的實現工作正常,sql查詢更小==更快。

但在我的Nhibernate SessionFactory中,我還注入了一個Nhibernate Intercerptor。 的攔截器的OnLoad方法,當我從NHibernate的道得到一個「用戶」實體被稱爲,但是當我從NHibernate的道獲得「LightweightUser」實體攔截器被不會觸發 (OnLoad方法)。

這可能與NHibernate SessionFactory不知道我的'LightweightUser'實體有關。有沒有辦法通知Sessionfactory/Interceptor存在我的「輕量級」實體?還是有一些其他技術將投影連接到攔截器?是的,我也可以爲我的Lightweight實體複製'hbm'文件,但這似乎是不好的做法。提前

回答

2

攔截器的方法OnLoad

[TestFixture] 
    public class InterceptorTest : NhibernateSessionHelper 
    { 
    [Test] 
    public void GetEntiy() 
    { 
     //ok trigger OnLoad in the Interceptor 
     var user = GetSession().Get<User>(1); 
     Assert.IsNotNull(user); 
    } 

    [Test] 
    public void GetProjection() 
    { 
     var crit = GetSession().CreateCriteria<User>(); 
     crit.Add(Restrictions.Eq("Id", 5)); 
     crit.SetProjection(Projections.ProjectionList() 
             .Add(Projections.Property("Id"), "Id") 
             .Add(Projections.Property("Username"), "UserName")); 

     crit.SetResultTransformer(Transformers.AliasToBean(typeof(LightweightUser))); 

     //does not trigger the Interceptor 
     var result = crit.List<LightweightUser>(); 

     Assert.IsNotNull(result.First()); 

    } 
} 


    //Wire the Sessionfactory with Interceptor 
    private static ISessionFactory CreateSessionFactory() 
    { 
     return new Configuration() 
     .CurrentSessionContext<ThreadStaticSessionContext>() 
     .SetInterceptor(new MyInterceptor()) 
      .Configure().BuildSessionFactory(); 
    } 


public class MyInterceptor: IInterceptor 
{ 
    public override bool OnLoad(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types) 
    { 
     //do stuff 

     var s = entity; 
     return base.OnLoad(entity, id, state, propertyNames, types); 
    } 

由於僅在PreLoadEvent處理調用。這是在兩種情況下引發的:從數據庫加載實體時,或者從緩存組裝實體時。使用像您這樣的投影創建的對象不被視爲實體。

如果要應用相同的代碼爲實體和LightweightUser的元組可以實現您的自定義IResultTransformer含

Transformers.AliasToBean(typeof(LightweightUser)) 

,並要求原變壓器方法後一個實例應用您的

邏輯
//do stuff 

如果想了解更多關於攔截器,我建議你閱讀我的博客條目列表這裏開始的:http://blog.scooletz.com/2011/02/03/nhibernate-interceptor-magic-tricks-pt-1/