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)
是否有一种方法可以获得更新前状态而无需往返数据库?
另一种方法是在加载时存储先前的状态.
@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)
| 归档时间: |
|
| 查看次数: |
808 次 |
| 最近记录: |