使用hibernate是否有任何普遍接受的,经过验证的工作方式,可以保存数据库中实体更改的历史记录?
我们需要跟踪相当多的对象,并且我们希望能够撤消对对象的更改。
我尝试使用hibernate的拦截器,但是只有在执行merge()
时才能使用该对象的旧状态。我们大多数情况下update()
或saveOrUpdate()
虽然......
我目前正在让Guice继续与Guice一起管理会议。
答案 0 :(得分:4)
我用Interceptor完成了这个(基于EmptyInterceptor创建我自己的)。我能够在onFlushDirty()中获得所有更改(合并,保存,saveOrUpdate和删除)。
我使用的EmptyInterceptor方法:
@Override
public boolean onFlushDirty(Object object, Serializable id,
Object[] newValues, Object[] oldValues, String[] properties,
Type[] types) throws CallbackException {
@Override
public boolean onSave(Object object, Serializable id, Object[] newValues,
String[] properties, Type[] types) throws CallbackException {
@Override
public void onDelete(Object object, Serializable id, Object[] newValues,
String[] properties, Type[] types) throws CallbackException {
在onFlushDirty()中,我不得不查询实体的先前状态:
Connection c = sessionFactory.getCurrentSession().connection();
Session session = sessionFactory.openSession(c);
BaseEntity newBaseEntity = (BaseEntity) object;
BaseEntity oldBaseEntity = (BaseEntity) session.get(newBaseEntity.getClass(), newBaseEntity.getId());
答案 1 :(得分:1)
JBoss envers也许就是你要找的。 p>
Envers项目旨在实现持久化类的简单审计/版本控制。您需要做的就是使用@Audited注释要审核的持久类或其某些属性。对于每个经审计的实体,将创建一个表,该表将保存对实体所做更改的历史记录。然后,您可以轻松地检索和查询历史数据。
与Subversion类似,库具有修订的概念。基本上,一个交易是一个修订(除非交易没有修改任何被审计的实体)。由于修订是全局的,具有修订号,您可以查询该修订版中的各种实体,检索该修订版的数据库的(部分)视图。您可以找到具有日期的修订号,反之亦然,您可以获得提交修订的日期。
答案 2 :(得分:1)
JBoss的Hibernate Envers可能就是你要找的东西:
Envers项目旨在实现对持久化类的轻松审计/版本控制。您需要做的就是使用@Audited注释要审核的持久类或其某些属性。对于每个经审计的实体,将创建一个表,该表将保存对实体所做更改的历史记录。然后,您可以毫不费力地检索和查询历史数据。
答案 3 :(得分:1)
JBoss开发了一个自动版本控制和审计项目:envers。 我可以推荐使用它,我之前已经手动实现了审计,当你开始接近更复杂的用例时,这可能会变得非常混乱。
答案 4 :(得分:0)
我遇到了完全相同的问题。其中一种方法是lock()
使用之前的状态,然后merge()
使用新状态,而不是只使用新状态执行update()
。
然后hibernate知道之前/之后它在拦截器/事件监听器中可用。
HTH。