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