26

我有的:

我有 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 提供了更优雅的方式来检查哪些字段已被修改?如何?

附言

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

4

3 回答 3

18

您可以做的是制作一个 Hibernate 拦截器,它在创建、修改和更新等事件中充当触发器。 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();

于 2013-12-20T11:14:09.713 回答
8

如果您希望能够检查哪些字段已被修改,那么可能值得看看 Hibernate Envers,它作为一个审计工具创建一个单独的表,其中包含对您的业务逻辑表所做的更改。

http://www.jboss.org/envers

我开始将它用于一些内部审计,它真的很简单,而且效果很好。

这是一个快速教程:

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

于 2013-10-29T11:29:24.993 回答
1

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

于 2013-12-19T15:44:25.573 回答