2012-04-12 15 views
4

基本的に私はいくつかのフィールドを自動的に設定したい単純なHibernateInterceptorを持っています。このインターセプター(下図)EmptyInterceptorを拡張:Hibernate Interceptorが動作しない

public class EntityAuditInterceptor extends EmptyInterceptor { 

    /** 
    * The Serial Version UUID. 
    */ 
    private static final long serialVersionUID = 4636626262147801287L; 

    /* (non-Javadoc) 
    * @see org.hibernate.EmptyInterceptor#onFlushDirty(java.lang.Object, java.io.Serializable, java.lang.Object[], java.lang.Object[], java.lang.String[], org.hibernate.type.Type[]) 
    */ 
    public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) { 

     // doing stuff here 

     return false; 
    } 

    /* (non-Javadoc) 
    * @see org.hibernate.EmptyInterceptor#onSave(java.lang.Object, java.io.Serializable, java.lang.Object[], java.lang.String[], org.hibernate.type.Type[]) 
    */ 
    public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { 

       // doing stuff here 
     return false; 
    } 
} 

私は次のように春の設定ファイルを使用して配線しています:

<!-- Hibernate SessionFactory --> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="hsqlDbDataSource"/> 

     <property name="packagesToScan"> 
      <list> 
       <value>com.dreamteam.lms.**.*</value> 
      </list> 
     </property> 

     <!-- Adding Interceptor here --> 
     <property name="entityInterceptor"> 
      <bean class="com.dreamteam.lms.interceptors.EntityAuditInterceptor"></bean> 
     </property> 


     <property name="hibernateProperties"> 
      <props> 
       <!--<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>--> 
       <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
       <prop key="hibernate.generate_statistics">true</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.cache.use_second_level_cache">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
       <prop key="hibernate.cache.use_query_cache">true</prop> 
       <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop> 
      </props> 
     </property> 
    </bean> 

しかし、インターセプタは到達しません。誰か手掛かりがありますか?

<property name="entityInterceptor"> 
     <ref local="entityAuditInterceptor"/> 
    </property> 

答えて

1

Hibernateはあなたのインターセプタメソッドを呼び出すべきであるので、あなたの春のXML構成は、正しいことのように見えます:私はまた、次のようにトランザクションマネージャのBean定義に以下を追加しようとしています。しかし、これらのメソッドは常にfalseを返すように見えます。つまり、Hibernateは変更を無視します。

値を変更するときは、trueを返す必要があります。たとえば、このコードのすべてのプロパティを反復処理して、変更が行われた場合だけtrueを返します。

public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) { 
    boolean changed = false; 
    for (int i = 0; i < propertyNames.length; i++) { 
     if ("saveDate".equals(propertyNames[i])) { 
      currentState[i] = new Date(); 
      changed = true; 
     } 
    } 
    return changed; 
} 
+0

こんにちはgutch ...私はコードの部分をコメントアウトしています。私の問題は、それがインターセプタにまったく入ってこないことです。インターセプターにブレークポイントを設定しました。しかし、それは決して実行されません。私は本当に無知です。 – Kros

+0

@gutch非常によく似た質問を見ることができますか?http://stackoverflow.com/questions/27602318/hibernate-myinterceptoronflushdirty-is-never-called pls? –

13

はOKが、ただ記録のために、私は私の愚かな間違いであることが判明し、この問題を解決しました部。

EmptyInterceptorを拡張するインターセプタを実装したときに、メソッド 'onFlushDirty'などを追加しました。ここまでは順調ですね。問題は、私のIDEを使用して、使用されたクラスを自動インポートすると、誤ってorg.hibernate.type.Typeの代わりにjava.reflect.Typeをインポートすることになりました。したがって、私は本当にインターセプタメソッドをオーバーライドしていませんでした!

@Overrideインターセプタを自分のメソッドに追加したときに気づきました。ここで疑問が短くなるよう

もう一つの謎解く... :)

+8

あなたを見せてくれる、@Overrideは便利です! – Yuval

+0

@Krosあなたは非常によく似た質問を見るかもしれないhttp://stackoverflow.com/questions/27602318/hibernate-myinterceptoronflushdirty-is-never-called pls? –

+0

同じ問題がありました - org.hibernate.typeではなくjava.reflect.Type。幸いにも私はこの答えを見つけました! – olivmir

関連する問題