【发布时间】:2013-01-05 08:30:36
【问题描述】:
我有一组域对象及其相关的应用程序配置表。经过身份验证的用户可以通过表示层更改这些域对象数据。这些域对象有非常重要的数据,我需要找出谁以及何时更改了他们的数据。我的应用程序的 数据访问 层是使用 JPA、Hibernate 和 Spring 实现的。我需要记录每次更改,包括:用户 + 操作日期 + 操作类型 + 以前的值。
例如,让我们考虑一个微不足道的域对象(为了这个问题的目的而简化):
@Entity
class Connection
{
private Long id;
private String name;
private String protocol;
}
假设有一个具有以下值的Connection 实例:
Connection
id = 1;
name = Web;
protocol = HTTPS;
在用户(例如John)登录 UI 并将此连接更改为以下值后:
Connection
id = 1;
name = Web;
protocol = HTTP;
如您所见,John 将协议从 HTTPS 更改为 HTTP(将安全协议变为不安全!),因此我需要将 Connection 实例的历史记录保存在另一个表中以进行审计。
我已经为我研究了一个解决方案并发现了以下结果:
- 触发器:一种可能是在表上定义触发器,这种方式的缺点是依赖于数据库。
- Hibernate Envers:这个解决方案很好,但是让我的 DAO 层依赖于 Hibernate,我不会享受 JPA 及其提供者独立性的好处。
-
Spring Data Commons + hades: 很好,但通过
MappedSuperClass注释向任何实体添加了一些列,例如:Create User、Create Date、Last Update User和Last Update Date。这意味着存储实体的完整历史记录和状态。 - 我自己的设计/实现:* 我可以为这个目标实现一个层,但我不喜欢这个解决方案,因为我认为这个要求对我来说并不特别,而且我认为它已经被其他人解决了遵循最佳做法(我不应该重新发明轮子)
有人对此问题有任何建议或解决方案吗?
(对不起,如果我的问题很长,可能对专家来说太基础了)
【问题讨论】:
-
是的,这也是我的挑战。
-
你最后做了什么?
标签: java hibernate hibernate-envers auditing revision-history