3

是否有任何普遍接受的、经过验证的使用休眠的方法来保存数据库中实体更改的历史记录?

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

我尝试使用休眠的拦截器,但对象的旧状态仅在执行merge(). 大多数情况下,我们这样做update()或者saveOrUpdate()虽然......

我目前让 warp-persist 与 Guice 一起管理会话。

4

5 回答 5

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());
于 2009-12-18T09:01:47.203 回答
1

JBoss envers也许是您正在寻找的。

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

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

于 2009-12-18T09:04:06.937 回答
1

JBoss 的Hibernate Envers可能是您正在寻找的:

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

于 2009-12-18T09:04:25.637 回答
1

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

于 2009-12-18T09:06:14.623 回答
0

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

然后休眠知道之前/之后,它在拦截器/事件侦听器中可用。

HTH。

于 2009-12-18T08:59:15.600 回答