Java – Hibernate: myinterceptor #onflushdirty will never be called
Question: why never call myinterceptor #onflushdirty?
I extend abstractentitymanagerfactorybean in XML configuration
<bean id="myEntityManagerFactory" parent="abstractEntityManagerfactorybean" abstract="true">
<property name="entityInterceptor">
<bean class="xxxx.MyInterceptor"/>
</property>
</bean>
<bean id="abstractEntityManagerfactorybean" class="xxxx.MyEntityManagerfactorybean"/>
MyEntityManagerfactorybean
public class MyEntityManagerfactorybean extends AbstractEntityManagerfactorybean implements LoadTimeweaverAware {
private Interceptor entityInterceptor;
public Interceptor getEntityInterceptor() {
return entityInterceptor;
}
public void setEntityInterceptor(Interceptor interceptor) {
entityInterceptor = interceptor;
}
}
MyInterceptor:
public class MyInterceptor extends EmptyInterceptor {
public MyInterceptor() {
System.out.println("init"); // Works well
}
// PROBLEM - is never called
@Override
public boolean onFlushDirty(Object entity,Serializable id,Object[] currentState,Object[] prevIoUsState,String[] propertyNames,Type[] types) {
if (entity instanceof File) {
.....
}
return false;
}
}
Update: [explain why customizing dirty policies doesn't seem to be my way]
I want to update the modification timestamp every time I change the content in the folder entity excel folderposition At the same time, folderposition should be persistent rather than transient (meaning that it causes the entity to become dirty)
Because I use spring transactional and Hibernate templates, there are some subtle differences:
1) I cannot update the modification timestamp at the end of each setter, such as:
public void setXXX(XXX xxx) {
//PROBLEM: Hibernate templates collect object via setters,//means simple get query will cause multiple 'modified' timestamp updates
this.xxx = xxx;
this.modified = new Date();
}
2) I can't call setmodified manually because it has about 25 fields, and setXXX of each field is scattered throughout the application I have no right to restructure
@Entity
public class Folder {
/**
* GOAL: Changing of each of these fields except 'folderPosition' should cause
* 'modified' timestamp update
*/
private long id;
private String name;
private Date created;
private Date modified;
private Integer folderLocation;
@PreUpdate
public void preUpdate() {
//PROBLEM : change modified even if only location field has been changed!
//PROBLEM: need to kNow which fields have been updated!
modified = new Date();
}
....
}
Solution
You need to extend the finddirty method instead of onflushdirty See this tutorial for details by referring to the GitHub working example
