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

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

内容简介: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


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

查看所有标签

猜你喜欢:

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

人工智能

人工智能

腾讯研究院、中国信通院互联网法律研究中心、腾讯AI Lab、腾讯开放平台 / 中国人民大学出版社 / 2017-10-25 / 68.00元

面对科技的迅猛发展,中国政府制定了《新一代人工智能发展规划》,将人工智能上升到国家战略层面,并提出:不仅人工智能产业要成为新的经济增长点,而且要在2030年达到世界领先水平,让中国成为世界主要人工智能创新中心,为跻身创新型国家前列和经济强国奠定基础。 《人工智能》一书由腾讯一流团队与工信部高端智库倾力创作。本书从人工智能这一颠覆性技术的前世今生说起,对人工智能产业全貌、最新进展、发展趋势进行......一起来看看 《人工智能》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

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

各进制数互转换器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具