我有一组域对象及其用于应用程序配置的相关表。经过身份验证的用户可以通过表示层更改这些域对象数据。这些 域对象具有非常重要的数据,我需要找出谁以及何时更改了他们的数据。我的应用程序的数据访问层是使用 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
- 我自己的设计/实现: *我可以为这个目标实现一个层,但我不喜欢这个解决方案,因为我认为这个要求对我来说并不特别,我认为其他人已经按照最佳实践解决了它(我应该' t重新发明轮子)
有没有人对这个问题有任何建议或解决方案?
(对不起,如果我的问题很长,对于专家来说可能太基础了)