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

时间:2013-10-29 11:23:14

标签: java hibernate design-patterns jpa architecture

我拥有的内容:

我是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. 我应该在某些字段更改时以特定方式通知特定用户。
  3. 出了什么问题:

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

    问题:

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

    P.S。

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

3 个答案:

答案 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,它可以作为审计工具创建一个单独的表,其中包含对您的业务所做的更改逻辑表。

http://www.jboss.org/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您可以比较实体字段的旧值和新值。