These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Event listeners not fired after configured programmatically
PostPosted: Fri Jun 26, 2009 3:06 am 
Newbie

Joined: Fri Jun 26, 2009 2:39 am
Posts: 1
Hi, I am here looking for help on the event listeners. The version i am using is hibernate 3.0.

Below are the configurations of my codes.
I initialized the objects using spring bean..
Code:
<beans default-autowire="byName">
   <bean id="auditListener" class="test.audit.HistoryListener">
      <property name="auditDao" ref="auditDao"/>
   </bean>
   <bean id="hibernate" class="test.dao.Hibernate">
      <constructor-arg type="java.util.List">
         <list>
            <value>hibernate/Audit.hbm.xml</value>
         </list>
      </constructor-arg>
      <property name="historyListener" ref="auditListener"/>
   </bean>
</beans>


During initialization,
I have the listener set programmatically..
Code:
   public Hibernate(String configFile, List mappings){
      try {
         logger.debug("Loading configuration file "
               + Thread.currentThread().getContextClassLoader().getResource(configFile));
         config = new Configuration().configure(configFile);
         Iterator it = mappings.iterator();
         while(it.hasNext()){
            String mapping = (String) it.next();
            logger.debug("Adding mapping file " + mapping);
            config.addResource(mapping);
         }
         sessionFactory = config.buildSessionFactory();
         connectionProvider = config.buildSettings().getConnectionProvider();
         logger.debug("Hibernate session factory created.");
      } catch (Throwable t) {
         logger.error("Error creating session factory: " + t.getMessage());
         throw new ExceptionInInitializerError(t);
      }
   }

   public void setHistoryListener(HistoryListener historyListener) {
      config.setListener("pre-insert", historyListener);
      config.setListener("pre-update", historyListener);
      config.setListener("pre-delete", historyListener);
sessionFactory = config.buildSessionFactory();
   }


Below is the history listener that implements the preinsert,predelete, and preupdate events.
Code:
public final class HistoryListener  implements PreDeleteEventListener, PreInsertEventListener, PreUpdateEventListener {
   
   private static final long   serialVersionUID      = 1L;

   private static final Logger   logger               = Logger.getLogger(HistoryListener.class);

   public static final String   ACT_TYPE_INSERT         = "INSERT";

   public static final String   ACT_TYPE_UPDATE         = "UPDATE";

   public static final String   ACT_TYPE_DELETE         = "DELETE";

   public static final String   ACT_TYPE_RETRIEVE      = "RETRIEVE";

   public static final String   ACT_TYPE_UPDATE_BEFORE   = "UPDATE_BEFORE";

   public static final String   ACT_TYPE_UPDATE_AFTER   = "UPDATE_AFTER";

   private AuditDAO auditDao;

   public final boolean onPreInsert(final PreInsertEvent event) {

      logger.info("PreInsert .........") ;

      if (event.getEntity() instanceof BaseAuditableModel) {
         logger.info("PreInsert instanceof BaseAuditableModel .........") ;         
         try {
            BaseAuditableModel entity = (BaseAuditableModel) event.getEntity();
            Serializable entityId = event.getPersister().hasIdentifierProperty() ? event.getPersister()
                  .getIdentifier(event.getEntity(), event.getPersister().guessEntityMode(event.getEntity())): null;
            Class entityClass = event.getEntity().getClass();
            String actBy = entity.getCreatedBy();
            auditDao.saveAudit(entityId, entityClass, actBy, ACT_TYPE_INSERT, null, entity);

         } catch (HibernateException e) {
            logger.error("Unable to process audit log for INSERT operation", e);
         }
         logger.info("  AppAudit: [" + event.getClass() + "] Insert successfully and the log saved into AppAudit.");
      } else {
         logger.info("  AppAudit: [" + event.getClass() + "] Insert successfully without audit.");
      }
      return false;
   }
   
   public final boolean onPreDelete(final PreDeleteEvent event) {
      logger.info("onPreDelete  .........") ;         
      if(logger.isDebugEnabled()){
         logger.debug("Entity is " + event.getEntity().getClass().getName());
         logger.debug("auditable = " + (event.getEntity() instanceof BaseAuditableModel));
      }

      if (event.getEntity() instanceof BaseAuditableModel) {
         logger.info("onPreDelete  instanceof BaseAuditableModel .........") ;                  
         try {
            BaseAuditableModel entity = (BaseAuditableModel) event.getEntity();
            Serializable entityId = event.getPersister().hasIdentifierProperty() ? event.getPersister()
                  .getIdentifier(event.getEntity(), event.getPersister().guessEntityMode(event.getEntity())): null;
            Class entityClass = event.getEntity().getClass();
            String actBy = entity.getLastUpdBy();
            auditDao.saveAudit(entityId, entityClass, actBy, ACT_TYPE_DELETE, entity, null);
            logger.info("onPreDelete after saveAudit .........") ;      
         } catch (HibernateException e) {
            logger.error("Unable to process audit log for Delete operation", e);
         }
         logger.info("  AppAudit: [" + event.getClass() + "] Delete successfully and the log saved into AppAudit.");
      } else {
         logger.info("  AppAudit: [" + event.getClass() + "] Delete successfully without audit.");
      }
      return false;
   }

   public final boolean onPreUpdate(PreUpdateEvent event) {
      logger.info("onPreUpdate  .........") ;         
      if(logger.isDebugEnabled()){
         logger.debug("Entity is " + event.getEntity().getClass().getName());
         logger.debug("auditable = " + (event.getEntity() instanceof BaseAuditableModel));
      }

      if (event.getEntity() instanceof BaseAuditableModel) {
         BaseAuditableModel entity = (BaseAuditableModel) event.getEntity();
         Serializable entityId = event.getPersister().hasIdentifierProperty() ? event.getPersister().getIdentifier(
               event.getEntity(), event.getPersister().guessEntityMode(event.getEntity())) : null;
         Class entityClass = entity.getClass();

         // need to have a separate session for audit save
         BaseAuditableModel oldEntity = null;
         if (entityId != null) {
            StatelessSession session = event.getPersister().getFactory().openStatelessSession();
            oldEntity = (BaseAuditableModel) session.get(entity.getClass(), entityId);
            session.close();
         }
         else{
            logger.info("  AppAudit: [" + event.getClass() + "] Identifier is not set, before image cannot be caught ");
         }

         // Save the AppAudit by AuditDAO
         auditDao.saveAudit(entityId, entityClass, entity.getLastUpdBy(), ACT_TYPE_UPDATE, oldEntity,
               entity);
         logger.info("  AppAudit: [" + event.getClass() + "] Update successfully and the log saved into AppAudit.");
      } else {
         logger.info("  AppAudit: [" + event.getClass() + "] Update successfully without audit.");
      }
      return false;
   }

   /**
    * @param auditDao The auditDao to set.
    */
   public void setAuditDao(AuditDAO auditDao) {
      this.auditDao = auditDao;
   }

}


In the system log, i found that the listener's class is set properly
Code:
[6/25/09 14:44:02:027 GST] 0000005c SystemOut     O PreDeleteEventListener .........1
[6/25/09 14:44:02:028 GST] 0000005c SystemOut     O Delete Event Get Class: class test.audit.HistoryListener


However, the predeleteevent is not fired when the delete action is made.

May I know what could be the cause of the reason? We have tried putting the listener in hibernate.cfg.xml and it works.. however, due to the reason that we need to initialize the bean, we did it programmatically..

Please advice..

Regards,
Yeow


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
cron
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.