2010-01-21 18 views
2

J'ai un NHibernate Interceptor qui est défini dans le HibernateTemplate en utilisant Spring.Net (j'utilise ASP.NET MVC, fwiw), qui est utilisé pour l'audit. Cependant, pour une raison quelconque, pendant que la méthode OnLoad est déclenchée lorsque j'appelle genericDAO.Get (id), lorsque j'essaie d'enregistrer quelque chose en utilisant genericDAO.SaveOrUpdate (object), ni les méthodes OnSave ni OnFlushDirty Interceptor ne sont appelées. Quelqu'un sait pourquoi cela pourrait être? J'ai défini des points d'arrêt sur les méthodes dans le débogueur VS, donc je suis à peu près certain que l'Interceptor est défini et que je ne manque aucun appel de méthode. Évidemment, tout est sauvegardé et récupéré correctement aussi.NHibernate Interceptor non utilisé lors de l'enregistrement

public class AuditInterceptor 
    : EmptyInterceptor 
{ 

    public override bool OnLoad(object entity, object id, object[] state, string[] propertyNames, IType[] types) 
    { 
     // Implementation 
     // Called when using genericDAO.Get(id) 
    } 

    public override bool OnSave(Object entity, Object id, Object[] state, 
     String[] propertyNames, IType[] types) 
    { 
     // Implementation 
     // NOT called when using genericDAO.SaveOrUpdate(entity) 
    } 

    public override bool OnFlushDirty(Object entity, Object id, 
     Object[] currentState, Object[] previousState, 
     String[] propertyNames, IType[] types) 
    { 
     // Implementation 
    } 
} 
+0

Pourriez-vous montrer une partie de votre configuration? – BennyM

+0

J'ai copié dans le fichier objects.xml ci-dessous. Y a-t-il autre chose que vous pensez que cela aiderait à voir? – LucyB

Répondre

0

Ceci est une version allégée (et anonymisées) de mon fichier objects.xml:

<object id="MyController" singleton="false" type="Project.Web.Controllers.MyController"> 
    <constructor-arg name="dashboardService" ref="DashboardService" /> 
    </object> 

<object id="DashboardService" type="Project.Business.Services.DashboardService, Project.Business"> 
    <constructor-arg name="dashboardDao" ref="DashboardDao" /> 
    </object> 

<object id="DashboardDao" type="Project.Data.Dao.DashboardDao, Project.Data"> 
    <property name="SessionFactory" ref="SessionFactory"/> 
    <property name="HibernateTemplate" ref="myHibernateTemplate" /> 
    </object> 

<object id="myHibernateTemplate" type="Spring.Data.NHibernate.Generic.HibernateTemplate, Spring.Data.NHibernate20"> 
    <property name="SessionFactory" ref="SessionFactory"/> 
    <property name="EntityInterceptor" ref="myAuditInterceptor"/> 
    <property name="TemplateFlushMode" value="Auto" /> 
    <property name="CacheQueries" value="true" /> 
    </object> 

    <object id="myAuditInterceptor" type="Project.Business.Audit.AuditInterceptor, Project.Business"> 
    <constructor-arg name="userService" ref="userService" /> 
    <constructor-arg name="auditService" ref="auditService" /> 
    <constructor-arg name="sessionFactory" ref="myAuditSessionFactory" /> 
    </object> 

<db:provider id="myDbProvider" 
       provider="SqlServer-2.0" 
       connectionString="Data Source=(local);Initial Catalog=myDB;Integrated Security=SSPI" /> 


    <object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate20"> 
    <property name="DbProvider" ref="myDbProvider"/> 
    <property name="MappingAssemblies"> 
     <list> 
     <value>Project.Data</value> 
     </list> 
    </property> 
    <property name="HibernateProperties"> 
     <dictionary> 
     <entry key="connection.provider" 
       value="NHibernate.Connection.DriverConnectionProvider"/> 
     <entry key="dialect" 
       value="NHibernate.Dialect.MsSql2005Dialect"/> 
     <entry key="connection.driver_class" 
       value="NHibernate.Driver.SqlClientDriver"/> 
     </dictionary> 
    </property> 
    </object> 

    <object id="myAuditSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate20"> 
    <property name="DbProvider" ref="myDbProvider"/> 
    <property name="MappingAssemblies"> 
     <list> 
     <value>Project.Data</value> 
     </list> 
    </property> 
    <property name="HibernateProperties"> 
     <dictionary> 
     <entry key="connection.provider" 
       value="NHibernate.Connection.DriverConnectionProvider"/> 
     <entry key="dialect" 
       value="NHibernate.Dialect.MsSql2005Dialect"/> 
     <entry key="connection.driver_class" 
       value="NHibernate.Driver.SqlClientDriver"/> 
     </dictionary> 
    </property> 
    </object> 
0

Il semble que vous ne l'utilisez pas les transactions. Vous devriez essayer de les utiliser comme indiqué dans l'exemple Spring Nhibernate (par exemple :) et activer la journalisation pour voir si la session est vidée.

<!-- Hibernate Transaction Manager--> 
<object id="hibernateTransactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager , Spring.Data.NHibernate20"> 
<property name="DbProvider" ref="myDbProvider"/> 
<property name="SessionFactory" ref="SessionFactory"/> 
<property name="EntityInterceptor" ref="myAuditInterceptor"/> 
</object> 

Vous déclarez également deux usines de session. Ce n'est pas lié je suppose mais est-ce intentionnel? Aussi ce rather old thread pour le printemps de Java pourrait être utile.

+0

Merci, je vais jouer avec le gestionnaire de transactions. Les deux usines de sessions sont intentionnelles pour éviter les problèmes lorsque l'intercepteur réécrit dans la base de données. – LucyB