我拥有的内容:
我是Hibernate实体,它包含许多非瞬态字段,包括集合。用户可以单独更新每个字段或一次更新某些字段。
真是个挑战:
在处理程序中,我应该检查实体的哪个字段已被更改:
public void handle(Entity newVersion) {
Session session = sessionFactory.openSession();
Entity oldVersion = (Entity) session.get(Entity.class, entity.getId());
List changedFields = compareChanges(oldVersion, newVersion); //HOW TO CHECK WHICH FIELDS ARE CHANGED?
}
我想出于安全和通知原因这样做。的意思是:
出了什么问题:
我的代码非常难看。实际上,我遍历所有字段/集合并调用equals
方法。
的问题: 的
可能是Hibernate提供更优雅的方式来检查哪些字段已被修改?怎么样?的
的 P.S。 的
@victorantunes提供了一个解决方案,但对我来说似乎太全面了。可能是一些替代方案?
答案 0 :(得分:15)
你可以做的是制作一个Hibernate Interceptor,它在创建,修改和更新等事件中就像一个触发器。 http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html 以便在给定实体即将被修改和持久化之前的任何点, 1.您可以检查用户是否具有访问权限(您可以从会话或数据库获取用户名)来修改特定字段,因此您可以授予访问权限以进行保存或更新。 2.您只能在实体被修改时通知其他用户。
通过这种方式,您可以在Spring的实现Hibernate 4中创建一个新的会话范围拦截器 Session session = s.withOptions()。interceptor(new YourInterceptor()。openSession();
答案 1 :(得分:7)
如果你想要的是能够检查哪些字段已被修改,那么可能值得一看Hibernate Envers,它可以作为审计工具创建一个单独的表,其中包含对您的业务所做的更改逻辑表。
我开始使用它进行内部审核,它非常简单,就像一个魅力。
这是一个快速教程:
https://thenewcircle.com/s/post/115/easy_auditing_versioning_for_your_hibernate_entities_with_envers
答案 2 :(得分:1)
我认为可以使用Hibernate拦截器http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html您可以比较实体字段的旧值和新值。