I am working with a configured spring sleeping application. There is transaction management and an audit request defined as an entityInterceptor. When I debug the code, I enter the entityInterceptors methods and the date is set, however at the end of the save they are not in the database: (.
Consider the following configuration
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="hibernateProperties"> <value> hibernate.dialect=${hibernate.dialect} hibernate.show_sql=${hibernate.show_sql} hbm2ddl.auto=${hbm2ddl.auto} </value> </property> <property name="schemaUpdate"> <value>true</value> </property> <property name="annotatedClasses"> <list> .. bunch of annotatedClasses" ... </list> </property> </bean> <bean name="auditInterceptor" class="com.mbalogos.mba.dao.AuditInterceptor" /> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> <property name="entityInterceptor" ref="auditInterceptor"/> </bean> <bean id="namedQueryDao" class="com.mbalogos.mba.dao.NamedQueryDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
and after entityInterceptor
public class AuditInterceptor extends EmptyInterceptor{ private static final long serialVersionUID = -8374988621501998008L; @Override public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { if(entity instanceof DomainObject){ Timestamp date = new Timestamp(new Date().getTime()); ((DomainObject)entity).setCreationDate(date); ((DomainObject)entity).setModificationDate(date); } return true; } @Override public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) { if(entity instanceof DomainObject){ DomainObject domainObject = (DomainObject)entity; Timestamp date = new Timestamp(new Date().getTime()); domainObject.setModificationDate(date); } return true; } @Override public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { super.onDelete(entity, id, state, propertyNames, types); } @SuppressWarnings("rawtypes") @Override public void preFlush(Iterator entities) { super.preFlush(entities); } @SuppressWarnings("rawtypes") @Override public void postFlush(Iterator entities) { super.postFlush(entities); } }
after saving the method, sessionFactory is introduced into the class
public <T extends DomainObject> T save(T objectToSave) { Session currentSession = null; try { currentSession = sessionFactory.getCurrentSession(); currentSession.save(objectToSave); return objectToSave; } catch (Exception ex) { logger.error(ex); } return null; }
Does anyone know why this behavior occurs. Oh, I also tried putting the entityInterceptor in sessionFactory, and not in the operatormanager, which was my first attempt, the same behavior: (