如何获取previouseState而不使用hibernate拦截器从db中获取创建审计跟踪表?

igx*_*igx 1 java spring hibernate jpa interceptor

我正在尝试创建一个审计表,结束看起来像这样:

实体ID,财产的属性oldValue,NEWVALUE,用户,时间戳

使用hibernate EmptyInterceptor 我希望这个表有很多IO.似乎onFlushDirty方法的previouseState没有像我预期的那样工作.

我怎么能不得到如图所示从数据库中获取它的旧值在这里

我试图关注这篇文章

public class AuditLogInterceptor extends EmptyInterceptor {
    private Set inserts    = new HashSet();
    private Set updates    = new HashSet();
    private Set deletes    = new HashSet();
    private Map oldies     = new HashMap();

    @Override
    public boolean onSave(Object entity,
                          Serializable id,
                          Object[] state,
                          String[] propertyNames,
                          Type[] types)
            throws CallbackException {
        if (entity instanceof Auditable)
            inserts.add((Auditable)entity);
        return false;
    }

    @Override
    public void onDelete(Object entity, Serializable id, Object[] state,
            String[] propertyNames, Type[] types) {
        if (entity instanceof Auditable)
            deletes.add((Auditable)entity);
    }

    @Override
    public boolean onFlushDirty(Object entity,
                                Serializable id,
                                Object[] currentState,
                                Object[] previousState,
                                String[] propertyNames,
                                Type[] types)
            throws CallbackException {
        if (entity instanceof Auditable) {
            try {
                // Use the id and class to get the pre-update state from the database
                Session tempSession =
                    HibernateUtil.getSessionFactory().openSession();
                Auditable old = (Auditable) tempSession.get(entity.getClass(), ((Auditable) entity).getId());
                oldies.put(old.getId(), old);
                updates.add((Auditable)entity);
            } catch (Throwable e) {
                _log.error(e,e);
            }
        }
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

是否有一种方法可以获得更新前状态而无需往返数据库?

Ala*_*Hay 5

另一种方法是在加载时存储先前的状态.

@Entity
@Table(name='Foo')
class Foo {

    @Transient
    private Foo previousState;

    @PostLoad
    private void setPreviousState(){
        previousState = new Foo();
        //copy the fields
    }

    public Foo getPreviousState(){
        return previousState;
    }

}
Run Code Online (Sandbox Code Playgroud)