2010-01-21 3 views
2

У меня есть перехватчик NHibernate, который установлен в HibernateTemplate с использованием Spring.Net (я использую ASP.NET MVC, fwiw), который используется для аудита. Однако по какой-то причине, когда метод OnLoad запускается при вызове genericDAO.Get (id), когда я пытаюсь что-то сохранить с помощью genericDAO.SaveOrUpdate (object), не вызывают методы OnSave или OnFlushDirty Interceptor. Кто-нибудь знает, почему это может быть?NHibernate Interceptor не используется при сохранении

Я установил точки останова для методов в отладчике VS, поэтому я вполне уверен, что Interceptor установлен и что я не пропускаю никаких вызовов методов. Очевидно, что все сохраняется и правильно получается.

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

Не могли бы вы показать некоторые из ваших настроек? – BennyM

+0

Я скопировал файл objects.xml ниже. Есть ли что-нибудь еще, что вы думаете, что это поможет увидеть? – LucyB

ответ

0

Это урезанный (и анонимный) версия моего файла 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

кажется, что вы не используете транзакции. Вы должны попробовать использовать их, как показано в примере Spring Nhibernate (например, :) и активировать ведение журнала, чтобы действительно увидеть, очищается ли сеанс.

<!-- 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> 

Также вы объявляете два сеансовых завода. Это не связано, я думаю, но это намеренно? Также этот rather old thread для весны Java может оказаться полезным.

+0

Спасибо, у меня будет игра с менеджером транзакций. Заводы двух сеансов намерены избегать проблем, когда перехватчик записывает обратно в базу данных. – LucyB

Смежные вопросы