2012-04-12 14 views
4

Ich habe einen einfachen HibernateInterceptor, in dem ich grundsätzlich ein paar Felder automatisch einstellen möchte. Dieses Interceptor (siehe unten) erstreckt EmptyInterceptor:Hibernate Interceptor funktioniert nicht

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

I Verdrahtung ist eine Feder-Konfigurationsdatei wie folgt verwendet:

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

Allerdings ist das Interceptor nie erreicht. Hat jemand eine Ahnung? Ich habe versucht, auch die folgenden auf die Transaktions-Manager Bean Definition Zugabe wie folgt:

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

Antwort

1

Es ist wie Konfiguration Ihre Spring-XML sieht richtig ist, so Hibernate sollte Ihre Abfangjäger Methoden anrufen. Diese Methoden geben jedoch immer false zurück, was bedeutet, dass Hibernate alle von Ihnen vorgenommenen Änderungen ignoriert. Wenn Sie einen Wert ändern, müssen Sie true zurückgeben. Zum Beispiel dieser Code wird für alle Eigenschaften und gibt true wenn und nur wenn eine Änderung vorgenommen wird:

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

Hallo gutch ... Ich habe Teile des Codes auskommentiert, so dass die Frage hier kürzer ist. Mein Problem ist, dass es den Abfangjäger überhaupt nicht betritt. Ich habe einen Haltepunkt im Abfangjäger platziert. Aber es wird nie ausgeführt. Ich bin wirklich ahnungslos. – Kros

+0

@gutch könnten Sie sehr ähnliche Frage http://stackoverflow.com/questions/27602318/hibernate-myinterceptoronflushdirty-isne- aufgerufenen pls aussehen? –

13

Ok, nur für das Protokoll, löste ich dieses Problem, das von einem dummen Fehler entpuppte meine Teil.

Als ich meinen Interceptor implementierte, der EmptyInterceptor erweitert, fügte ich die Methode 'onFlushDirty' hinzu und so weiter. So weit, ist es gut. Das Problem war, dass ich bei der Verwendung meiner IDE zum automatischen Importieren der verwendeten Klassen am Ende java.reflect.Type anstelle von org.hibernate.type.Type aus Versehen importierte. Daher habe ich die Interzeptormethode nicht wirklich außer Kraft gesetzt!

Ich bemerkte, dass, wenn ich den @Override Interceptor zu meiner Methode hinzugefügt.

Ein anderes Geheimnis gelöst ... :)

+8

Was Ihnen zeigt, dass @Override nützlich ist! – Yuval

+0

@Kros ​​können Sie sehr ähnliche Frage http://stackoverflow.com/questions/27602318/hibernate-myinterceptoronflushdirty-isne- aufgerufenen pls aussehen? –

+0

Ich hatte das gleiche Problem - java.reflect.Type anstelle von org.hibernate.type. Zum Glück habe ich diese Antwort gefunden! – olivmir

Verwandte Themen