作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个最终看起来像这样的审计表:
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/
我是一名优秀的程序员,十分优秀!