2012-04-12 3 views
4

J'ai un HibernateInterceptor simple dans lequel fondamentalement je veux placer quelques champs automatiquement. Cet intercepteur (ci-dessous) étend EmptyInterceptor:Hibernate Interceptor ne fonctionne pas

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

Je câblage à l'aide d'un fichier de configuration de ressort comme suit:

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

Cependant, l'Interceptor est jamais atteint. Est-ce que quelqu'un a la moindre idée? J'ai aussi essayé d'ajouter ce qui suit à la définition de haricot gestionnaire de transactions comme suit:

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

Répondre

1

Il ressemble à votre configuration Spring XML est correct, donc Hibernate devrait appeler vos méthodes d'interception. Toutefois, ces méthodes semblent toujours renvoyer false, ce qui signifie qu'Hibernate ignorera toutes les modifications que vous apportez.

Lorsque vous modifiez une valeur, vous devez renvoyer true. Par exemple, ce code itère à travers toutes les propriétés et retourne true si et seulement si un changement:

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

Salut Gutch ... J'ai commenté parties du code afin que la question ici est plus courte. Mon problème est qu'il n'entrera pas du tout dans l'intercepteur. J'ai placé un point d'arrêt dans l'intercepteur. Pourtant, il n'est jamais exécuté. Je suis vraiment désemparé. – Kros

+0

@gutch pourriez-vous regarder la question très similaire http://stackoverflow.com/questions/27602318/hibernate-myinterceptoronflushdirty-is-never-called pls? –

13

Ok, pour le compte rendu, je résolu ce problème qui est avéré être une erreur stupide de ma partie. Lorsque j'ai implémenté mon intercepteur qui étend EmptyInterceptor, j'ai ajouté la méthode 'onFlushDirty' et ainsi de suite. Jusqu'ici tout va bien. Le problème était que lors de l'utilisation de mon IDE pour importer automatiquement les classes utilisées, j'ai fini par importer java.reflect.Type au lieu de org.hibernate.type.Type par erreur. Par conséquent, je ne remplaçais pas vraiment la méthode d'interception! J'ai remarqué que lorsque j'ai ajouté l'intercepteur @Override à ma méthode.

Un autre mystère résolu ... :)

+8

Ce qui va vous montrer, @Override est utile! – Yuval

+0

@Kros ​​pouvez-vous regarder la question très similaire http://stackoverflow.com/questions/27602318/hibernate-myinterceptoronflushdirty-is-never-called pls? –

+0

J'ai eu le même problème - java.reflect.Type au lieu de org.hibernate.type. Heureusement, j'ai trouvé cette réponse! – olivmir

Questions connexes