我有一组域对象及其相关的表,用于应用程序的配置.经过身份验证的用户可以通过表示层更改这些域对象数据.这些域对象具有非常重要的数据,我需要找到谁和何时更改了他们的数据.我的应用程序的数据访问层是使用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注释向任何实体添加了一些列:创建用户,创建日期,上次更新用户和上次更新日期.它意味着存储实体的完整历史和状态.
>我自己的设计/实现:*我可以为这个目标实现一个层,但我不喜欢这个解决方案,因为我觉得这个要求对我来说并不特别,我认为这是其他人按照最佳实践解决的(我不应该重新发明轮子)
有没有人对此问题有任何建议或解决方案?
(对不起,如果我的问题很长,可能对专家来说太基础了)