Hibernate,保存对象之前的状态

标签 hibernate session history undo

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

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

我尝试使用hibernate的拦截器,但对象的旧状态仅在执行merge()时可用。大多数情况下,我们都会执行 update()saveOrUpdate()...

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

最佳答案

我已经使用拦截器完成了此操作(根据 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());

关于Hibernate,保存对象之前的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1927098/

相关文章:

java - Hibernate:根据年龄对对象进行排序

Django session 在 Internet Explorer 中不起作用

PHP - session_unset 是否取消注册 $_SESSION 变量?

php - 记住我的 cookie,需要 session cookie?

mysql - Spring Roo - 多对多关系在每次更新时删除和插入 - 如何更改此行为

java - entityManager.find 和 entityManager.createQuery 有什么区别?

java - Eclipse “Class File Editor” 在 Eclipse Kepler 中调试时未找到源代码

c - 如何将 readline 历史记录保存在文本文件中并在之后调用它

c - -isysroot 或 SDKROOT 问题

coldfusion - 为什么 ColdFusion 的设计者决定从 1 而不是 0 索引数组?