java – 如何检查Hibernate中的实体是否脏?

栏目: Hibernate · 发布时间: 7年前

内容简介:http://stackoverflow.com/questions/20393006/how-to-check-if-entity-in-hibernate-is-dirty

如何检查Hibernate中的实体是否处于脏状态?即我想要只有在某些字段已更改时,才能设置UpdatedBy和UpdatedAt.所以我可以做对象检查手动比较2个对象中的每个字段,但是可能存在一些比较优雅的方式呢?

此外,如果我将对象的字段设置为与之前相同的值,那么hibernate会使实体变脏吗?即:

String name = myEntity.getName()
myEntity.setName(name);

编辑:

但是我也有另一个问题 – 我有一个嵌套集合的实体,所以如果只改变了该集合中的元素,那么我只想在该集合元素上设置UpdatedBy,而不是在拥有该集合的对象上设置.我使用级联操作进行更新.

是一个很好的问题,这是简短的答案:Hibernate-Session有一个方法isDirty()

例子的长答案(测试案例1):

如果您在Hibernate之上使用Seam / POJO / JPA.

你可以在调用entityManager.flush()之前知道实体是脏的,即知道Hibernate将发出更新语句 – 并在这些记录上应用一些更改(设置一些值,比如改变记录等等) .

你知道Hibernate-Session有一个方法isDirty(),但这在某些情况下是不够的.

你可以在你的persistence.xml文件中注册一个Hibernate-Interceptor

<property name="hibernate.ejb.interceptor" value="path.to.MyInterceptor" />

并拦截方法onFlushDirty(…)并将脏对象保存在地图中,但如何稍后才能访问此地图?我在运行时没有访问拦截器(所以我可以调用interceptor.getDirtyEntities()),你有这样的:

public class MyInterceptor extends EmptyInterceptor {  
         private Map<IdentityKey,Object> dirtyEntitiesMap = new HashMap<IdentityKey,Object>();  

     @Override  
     public boolean onFlushDirty(Object entity, Serializable id,  
               Object[] currentState, Object[] previousState,  
               String[] propertyNames, Type[] types) {  

           dirtyEntitiesMap.put(new IdentityKey(id, entity.getClass()), entity);    
           return super.onFlushDirty(entity, id, currentState, previousState, propertyNames, types);  
     }  
...  
}

解决这个测试案例:

如果您只需要更新,那么您不需要知道哪些实体更改.您可以在@PreUpdate方法中添加您的代码(填充更改它们的用户).脏的实体将被相应地修改,那些不会得到这个方法被调用,因为没有什么可以更新(和Hibernate会检测到).您可以对@PrePersist方法中的新实体执行相同操作,这可能是相同的.您可以使用两者注释相同的方法.

如果您还需要记录哪些字段已更改,建议先查看Envers.

http://stackoverflow.com/questions/20393006/how-to-check-if-entity-in-hibernate-is-dirty


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learning PHP 5

Learning PHP 5

David Sklar / O'Reilly / July, 2004 / $29.95

Learning PHP 5 is the ideal tutorial for graphic designers, bloggers, and other web crafters who want a thorough but non-intimidating way to understand the code that makes web sites dynamic. The book ......一起来看看 《Learning PHP 5》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具