Hibernate:永远不会调用MyInterceptor#onFlushDirty
问题: 为什么永远不会调用MyInterceptor#onFlushDirty
?
我在xml配置中扩展AbstractEntityManagerFactoryBean
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; } }
更新:[解释为什么自定义脏策略看起来不是我的方式]
我想在每次更改Folder
实体EXCEPT folderPosition
时更新modified
时间戳。 同时, folderPosition
应该是持久的而不是瞬态的(意味着导致实体变脏)。
由于我使用Spring Transactional和Hibernate模板,因此有一些细微差别:
1)我无法更新每个setter末尾的修改时间戳,如:
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)我不能手动调用setModified
,因为它有大约25个字段,并且每个字段的setXXX
分散在整个应用程序中。 我没有权力进行重构。
@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(); } .... }
您需要扩展findDirty
方法而不是onFlushDirty
。 请参阅本教程以获取详细说明,并参考GitHub工作示例。
- 从具有相同持久性单元的多个Db读取?
- JPA:将空的Fetch结果加入NULL空
- javagenerics类型参数和对这些类型的操作
- org.hibernate.loader.MultipleBagFetchException:无法同时获取多个行李
- 没有元模型使用的JPA 2 Criteria API不区分大小写的条件
- Spring boot + Hibernate + JPA没有事务性的EntityManager可用
- Hibernate使用PostgreSQL序列不会影响序列表
- Hibernate 4中的SessionFactory.openSession(Connection)
- Hibernate HQL Join Query DOT节点没有左侧