最近在項目中遇到一個奇怪的問題,在使用Hibernate攔截器捕獲實體變化并進行處理時,發現其中的onFlushDirty()函數執行了很多次,導致進行處理時產生很多重復數據。具體問題如下:
使用一個類繼承Hibernate的EmptyInterceptor類來對程序中的實體變化進行攔截,并在其中的onFlushDirty()函數中對捕獲的數據進行處理,產生對應的event數據并保存到數據庫中。 例如:
public class EventInterceptor extends EmptyInterceptor {
public boolean onFlushDirty(
Object entity,
Serializable id,
Object[] currentState,
Object[] previousState,
String[] propertyNames,
Type[] types ) throws CallbackException {
if(isAuditable(entity)){//如果該實體需要被記錄,生成對應的event。
//此處生成對應的event。
}
return false;
}
在程序執行后,發現對應一條實體的變化生成了多條重復的event記錄,非常不解。
后來google發現,有人也碰到過對應的問題,并在Hibernage論壇中提出過這個問題,鑒定為Hibernate的一個小Bug。
(原文地址:http://forum.hibernate.org/viewtopic.php?t=940410&highlight=interceptor+onflushdirty)
解決方法如下:
將FlushMode改為:FlushMode.COMMIT
或者也可以提前進行flush()
都可以解決這個問題。
使用一個類繼承Hibernate的EmptyInterceptor類來對程序中的實體變化進行攔截,并在其中的onFlushDirty()函數中對捕獲的數據進行處理,產生對應的event數據并保存到數據庫中。 例如:
public class EventInterceptor extends EmptyInterceptor {
public boolean onFlushDirty(
Object entity,
Serializable id,
Object[] currentState,
Object[] previousState,
String[] propertyNames,
Type[] types ) throws CallbackException {
if(isAuditable(entity)){//如果該實體需要被記錄,生成對應的event。
//此處生成對應的event。
}
return false;
}
在程序執行后,發現對應一條實體的變化生成了多條重復的event記錄,非常不解。
后來google發現,有人也碰到過對應的問題,并在Hibernage論壇中提出過這個問題,鑒定為Hibernate的一個小Bug。
(原文地址:http://forum.hibernate.org/viewtopic.php?t=940410&highlight=interceptor+onflushdirty)
解決方法如下:
將FlushMode改為:FlushMode.COMMIT
或者也可以提前進行flush()
都可以解決這個問題。