Hibernate,保存对象的先前状态

时间:2009-12-18 08:54:27

标签: hibernate session history undo

使用hibernate是否有任何普遍接受的,经过验证的工作方式,可以保存数据库中实体更改的历史记录?

我们需要跟踪相当多的对象,并且我们希望能够撤消对对象的更改。

我尝试使用hibernate的拦截器,但是只有在执行merge()时才能使用该对象的旧状态。我们大多数情况下update()saveOrUpdate()虽然......

我目前正在让Guice继续与Guice一起管理会议。

5 个答案:

答案 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也许就是你要找的。

Envers项目旨在实现持久化类的简单审计/版本控制。您需要做的就是使用@Audited注释要审核的持久类或其某些属性。对于每个经审计的实体,将创建一个表,该表将保存对实体所做更改的历史记录。然后,您可以轻松地检索和查询历史数据。

与Subversion类似,库具有修订的概念。基本上,一个交易是一个修订(除非交易没有修改任何被审计的实体)。由于修订是全局的,具有修订号,您可以查询该修订版中的各种实体,检索该修订版的数据库的(部分)视图。您可以找到具有日期的修订号,反之亦然,您可以获得提交修订的日期。

答案 2 :(得分:1)

JBoss的Hibernate Envers可能就是你要找的东西:

Envers项目旨在实现对持久化类的轻松审计/版本控制。您需要做的就是使用@Audited注释要审核的持久类或其某些属性。对于每个经审计的实体,将创建一个表,该表将保存对实体所做更改的历史记录。然后,您可以毫不费力地检索和查询历史数据。

答案 3 :(得分:1)

JBoss开发了一个自动版本控制和审计项目:envers。 我可以推荐使用它,我之前已经手动实现了审计,当你开始接近更复杂的用例时,这可能会变得非常混乱。

答案 4 :(得分:0)

我遇到了完全相同的问题。其中一种方法是lock()使用之前的状态,然后merge()使用新状态,而不是只使用新状态执行update()

然后hibernate知道之前/之后它在拦截器/事件监听器中可用。

HTH。