2009-06-11 4 views
1

Nous avons un système basé jbossPourquoi le programme onLoad() de l'intercepteur ne fonctionne-t-il pas?

persistance.xml ressemble à un suivant:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
     http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> 
    <persistence-unit name="solutions" transaction-type="JTA"> 
     <jta-data-source>java:/mam</jta-data-source> 

     <class>....</class> 
     ...... 
     <class>....</class> 

     <exclude-unlisted-classes>true</exclude-unlisted-classes> 
     <properties> 

      <property name="hibernate.connection.datasource" value="java:/mam"/> 
      <property name="jboss.entity.manager.factory.jndi.name" value="java:/solutions"/> 

      <property name="hibernate.ejb.interceptor" 
         value="interceptor.AuditAndDeletableCatcherInterceptor"/> 

      <property name="hibernate.hbm2ddl.auto" value="validate"/> 
      <property name="hibernate.show_sql" value="false"/> 
      <property name="hibernate.format_sql" value="false"/> 
      <property name="hibernate.use_sql_comments" value="false"/> 
      <property name="hibernate.generate_statistics" value="false"/> 

      <property name="hibernate.bytecode.use_reflection_optimizer" value="cglib"/> 
      <property name="hibernate.dialect" value="com.magenta.componentization.audit.sql.MySQL5CustomDialect"/> 
      <property name="hibernate.query.substitutions" value="true 1, false 0"/> 
      <property name="hibernate.connection.provider_class" 
         value="org.hibernate.connection.DatasourceConnectionProvider"/> 
      <property name="hibernate.current_session_context_class" value="thread"/> 

      <property name="cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/> 
     </properties> 
    </persistence-unit> 

</persistence> 

code de Interceptor:

public class AuditAndDeletableCatcherInterceptor extends AuditInterceptor { 

    DeletableCatcherDeligate deletableCatcherDeligate = 
      new DeletableCatcherDeligate(); 

    @Override 
    public boolean onLoad(Object o, Serializable serializable, Object[] objects, String[] strings, Type[] types) { 
     deletableCatcherDeligate.onLoad(o, serializable, objects, strings, types); 
     return super.onLoad(o, serializable, objects, strings, types); 
    } 
} 

Où AuditInterceptor étend EmptyInterceptor de mise en veille prolongée natif et de surcharge certaines méthodes comme onSave(), onFlush(), onPreFlush()

Certaines méthodes de l'AuditAn dDeletableCatcherInterceptor fonctionne, mais onLoad() n'est jamais appelé. Qu'est-ce que je fais de mal? OnLoad n'est appelé que si l'objet est récupéré à partir de la base de données et non pas de l'antémémoire.

Répondre

0

Si l'objet est déjà géré, l'onLoad n'est pas appelé. Vous pouvez tester cela en implémentant PrepareStatement et en voyant ce qu'il fait. Ce que je fais, c'est implémenter toutes les méthodes et les enregistrer toutes en écrivant un intercepteur, alors je sais exactement ce que ça fait.

Questions connexes