PreInsert and PreUpdate Event Listener in hibernate
event-listener, hibernate, java, orm
Solution
I had created Interceptor extend it with Hibernate EmptyInterceptor. Override method `onSave()` which will be Called when you save an object, the object is not save into database yet and `onFlushDirty()` Called when you update an object, the object is not update into database yet. In this function i have check my method by its name in which i have to set date at the time of created or updated. Here is sample code of onFlushDirty() method.
public boolean onFlushDirty(Object entity,Serializable id,Object[] currentState,
Object[] previousState,String[] propertyNames, Type[] types)
{
if ( entity instanceof City ) {
for ( int i=0; i < propertyNames.length; i++ ) {
if ( "lastUpdatedOn".equals( propertyNames[i] ) ) {
currentState[i] = new Date();
return true;
}
}
}
return false;
}
Here `lastUpdatedOn` is my method name which set updated date of record.
onSave() method :
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types)
{
if ( entity instanceof City) {
for ( int i=0; i<propertyNames.length; i++ ) {
if ( "createdOn".equals( propertyNames[i] ) ) {
state[i] = new Date();
return true;
}
}
}
return false;
}
Here `createdOn` is method to set created date for record.
Extend your POJO class with this interceptor class.
Problem
I have used `PreInsertEventListener` and `PreUpdateEventListener` Event Listener to insert created date and updated date in table. The problem i am facing is that when i save entity in database created date could not be inserted in table same as with insert updated date at the time of update record it will not insert updated date also. My code sample is show as below : Listener Class : ``` public class PreInsertListener implements PreInsertEventListener, PreUpdateEventListener { @Override public boolean onPreInsert(PreInsertEvent arg0) { City.class.cast(arg0.getEntity()).setCreated_date(new Date()); return false; } @Override public boolean onPreUpdate(PreUpdateEvent arg0) { System.out.println("Update event......"); City.class.cast(arg0.getEntity()).setUpdated_date(new Date()); return false; } } ``` Hibernate Connection class : ``` public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { AnnotationConfiguration config = new AnnotationConfiguration(); config.setListener("pre-insert", new PreInsertListener()); config.setListener("pre-update", new PreInsertListener()); sessionFactory = config.configure().buildSessionFactory();; } catch (Throwable ex) { System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } ``` Entity save and Update method in DAO : ``` public Long saveCity(String cityName) { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = null; Long cityId = null; try { transaction = session.beginTransaction(); City city = new City(); city.setName(cityName); cityId = (Long) session.save(city); //session.flush(); transaction.commit(); } catch (HibernateException e) { transaction.rollback(); e.printStackTrace(); } finally { session.close(); } return cityId; } public void updateCity(Long cityId, String cityName) { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = null; try { transaction = session.beginTransaction(); City city = (City) session.get(City.class, cityId); city.setName(cityName); session.update(city); //session.flush(); transaction.commit(); } catch (HibernateException e) { transaction.rollback(); e.printStackTrace(); } finally { session.close(); } } ``` My Test Class : ``` public class Main { public static void main(String[] args) { CityDAO cityDAO = new CityDAO(); long cityId1 = cityDAO.saveCity("New York"); cityDAO.updateCity(cityId1, "Paris"); } } ``` If i used `session.flush()` than it will insert both date created and updated but updated query is executed every time i call flush method. currently i commented code to call `session.flush()` method as show in code. What is the solution to this problem ?