2012-04-12 88 views
4

我有一個簡單的HibernateInterceptor,其中基本上我想自動設置幾個字段。這個攔截器(如下所示)延伸EmptyInterceptor:休眠攔截器不工作

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> 

然而,從未達到的攔截。有沒有人有任何線索?我也嘗試添加以下的事務管理器bean定義如下:

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

回答

1

它看起來像你的Spring XML配置是正確的,因爲Hibernate應該調用你的攔截器的方法。但是這些方法總是返回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 2012-04-13 09:57:30

+0

@gutch你可以看看非常類似的問題http://stackoverflow.com/questions/27602318/hibernate-myinterceptoronflushdirty-is-never-called請問? – 2014-12-22 14:27:42

13

好吧,只是爲了記錄在案,我解決了這個問題,這竟然是從一個愚蠢的錯誤我部分。

當我實現我的擴展EmptyInterceptor的攔截器時,我添加了方法'onFlushDirty'等。到現在爲止還挺好。問題在於,在使用我的IDE自動導入使用的類時,我最終導致錯誤地導入了java.reflect.Type而不是org.hibernate.type.Type。因此,我並不是真的重寫攔截器方法!

我注意到,當我將@Override攔截器添加到我的方法。

解決了另一個謎題...... :)

+8

這會告訴你,@Override是有用的! – Yuval 2013-10-23 12:29:24

+0

@Kros你可以看看非常類似的問題http://stackoverflow.com/questions/27602318/hibernate-myinterceptoronflushdirty-is-never-called請問? – 2014-12-22 14:27:02

+0

我有同樣的問題 - java.reflect.Type而不是org.hibernate.type。幸運的是我找到了這個答案! – olivmir 2018-02-27 13:21:53