Hibernate entity interceptor, but setpoints are not saved

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: (

+4
source share
2 answers

I managed to figure it out, I had to play with the names of the properties and their states, and not with the entity object ... It's strange, but why put the entity object if you can not play with it :(

 @Override public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) { return audit(currentState, propertyNames); } @Override public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { return audit(state, propertyNames); } private boolean audit(Object[] currentState, String[] propertyNames) { boolean changed = false; Timestamp timestamp = new Timestamp(new Date().getTime()); for(int i=0;i<propertyNames.length;i++){ if("creationDate".equals(propertyNames[i])){ Object currentDate = currentState[i]; if(currentDate == null){ currentState[i] = timestamp; changed = true; } } if("modificationDate".equals(propertyNames[i])){ currentState[i] = timestamp; changed = true; } } return changed; } 
+9
source

Thanks Kenny, I also ran into the same problem. In my case, interceptors work for some objects, but for the rest they do not work.
Some optimizations are possible:
* If you have finished searching for both properties, then break the cycle. * If you want to apply the audit method only with DomainObject, then filter this method with if(entity instanceof DomainObject)

However, I wonder why setting attributes directly on the object's object did not work for some objects. If you or anyone know the reason, please write here.

0
source

All Articles