Hibernate:检查修改了哪个实体的字段

是)我有的:

我有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? } 

我想出于安全和通知的原因这样做。 手段:

  1. 并非所有用户都可以修改所有字段
  2. 我应该在某些字段更改时以特定方式通知特定用户。

真是个问题:

我得到了非常难看的代码。 实际上我遍历所有字段/集合并调用equals方法。

题:

可能是Hibernate提供更优雅的方式来检查哪些字段已被修改? 怎么样?

PS

@victorantunes提供了一个解决方案,但对我来说似乎太全面了。 可能是一些替代品?

你可以做的是制作一个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();

如果您想要检查哪些字段已被修改,则可能需要查看Hibernate Envers,它可用作审计工具,创建一个单独的表,其中包含对业务逻辑表所做的更改。

http://www.jboss.org/envers

我开始使用它进行一些内部审计,它非常简单,就像一个魅力。

这是一个快速教程:

https://thenewcircle.com/s/post/115/easy_auditing_versioning_for_your_hibernate_entities_with_envers

我认为可以使用Hibernate拦截器http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html您可以比较实体字段的新旧值。