gpt4 book ai didi

java - 如何在不使用 hibernate 拦截器从数据库中获取的情况下获取previouseState来创建审计跟踪表?

转载 作者:行者123 更新时间:2023-11-29 07:43:54 24 4
gpt4 key购买 nike

我正在尝试创建一个最终看起来像这样的审计表:

entity,id,property,oldValue,newValue,user,timestamp

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

如何在不从数据库中获取旧值的情况下获取旧值,如图所示here

我试图关注 this post

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;
}

有没有办法在不往返数据库的情况下获取更新前的状态?

最佳答案

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

@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;
}

}

关于java - 如何在不使用 hibernate 拦截器从数据库中获取的情况下获取previouseState来创建审计跟踪表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27529208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com