2

監査に使用されるSpring.Net(ASP.NET MVC、fwiwを使用)を使用してHibernateTemplateに設定されているNHibernateインターセプターがあります。ただし、何らかの理由で、genericDAO.Get(id)を呼び出したときにOnLoadメソッドがトリガーされているときに、genericDAO.SaveOrUpdate(object)を使用して何かを保存しようとすると、OnSaveメソッドもOnFlushDirtyインターセプターメソッドも呼び出されません。なぜこれが起こるのか誰もが知っていますか?

VSデバッガー内のメソッドにブレークポイントを設定したので、インターセプターが設定されており、メソッド呼び出しが欠落していないことを確信しています。明らかに、すべてが正しく保存および取得されています。

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
    }
}
4

2 に答える 2

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>

また、2つのセッションファクトリを宣言しています。関係ないと思いますが、これは意図的なものですか?また、Javaの春のこのかなり古いスレッドが役立つかもしれません。

于 2010-02-15T21:17:44.493 に答える
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>
于 2010-01-28T10:56:27.707 に答える