我有一个用例,在更新实体之前,虽然仍然在服务方法中,我需要找到实体的哪些属性被更改,并且即将被更新。
在侦听器/拦截器中不可能这样做,因为这个动作必须在方法的上下文中完成。
任何想法?
你可以注入这个"上下文";通过一些本地线程进入你的拦截器,并在那里完成你的工作。像这样:
public void myService() {
MyInterceptor.withContext(
() -> {
entityManager.merge(myEntity);
entityManager.flush();
// Your service logic
},
(oldState, newState) -> {
// Your code
}
);
}
public class MyInterceptor extends EmptyInterceptor {
private static final ThreadLocal<UpdateHandler> TL = new ThreadLocal<>();
public static void withContext(Runnable r, UpdateHandler h) {
try {
TL.set(h);
r.run();
} finally {
TL.remove();
}
}
@Override
public boolean onFlushDirty(
Object entity,
Serializable id,
Object[] currentState,
Object[] previousState,
String[] propertyNames,
Type[] types) {
UpdateHandler handler = TL.get();
if (handler != null) {
handler.onUpdate(previousState, currentState);
}
return false;
}
}
public interface UpdateHandler {
public void onUpdate(Object[] oldState, Object[] newState);
}