java – Hibernate:永远不会调用MyInterceptor#onFlushDirty
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Hibernate:永远不会调用MyInterceptor#onFlushDirty,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2237字,纯文字阅读大概需要4分钟。
内容图文
![java – Hibernate:永远不会调用MyInterceptor#onFlushDirty](/upload/InfoBanner/zyjiaocheng/713/6d58662c94784ca888573c5a84710694.jpg)
问题:为什么永远不会调用MyInterceptor#onFlushDirty?
我在xml配置中扩展AbstractEntityManagerFactoryBean
<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;
}
}
更新:[解释为什么自定义脏策略看起来不是我的方式]
我想在每次更改文件夹实体EXCEPT folderPosition中的内容时更新修改时间戳.同时,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工作示例,查看this tutorial以获取详细说明.
内容总结
以上是互联网集市为您收集整理的java – Hibernate:永远不会调用MyInterceptor#onFlushDirty全部内容,希望文章能够帮你解决java – Hibernate:永远不会调用MyInterceptor#onFlushDirty所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。