一尘不染

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

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提供了更优雅的方法来检查哪些字段已被修改? 怎么样?

聚苯乙烯

@victorantunes提供了一个解决方案,但对我来说似乎太全面了。可能是其他选择?


阅读 300

收藏
2020-06-20

共1个答案

一尘不染

您可以做的是创建一个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();

2020-06-20