最近在項(xiàng)目中遇到一個奇怪的問題,在使用Hibernate攔截器捕獲實(shí)體變化并進(jìn)行處理時,發(fā)現(xiàn)其中的onFlushDirty()函數(shù)執(zhí)行了很多次,導(dǎo)致進(jìn)行處理時產(chǎn)生很多重復(fù)數(shù)據(jù)。具體問題如下:
使用一個類繼承Hibernate的EmptyInterceptor類來對程序中的實(shí)體變化進(jìn)行攔截,并在其中的onFlushDirty()函數(shù)中對捕獲的數(shù)據(jù)進(jìn)行處理,產(chǎn)生對應(yīng)的event數(shù)據(jù)并保存到數(shù)據(jù)庫中。 例如:
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)){//如果該實(shí)體需要被記錄,生成對應(yīng)的event。
//此處生成對應(yīng)的event。
}
return false;
}
在程序執(zhí)行后,發(fā)現(xiàn)對應(yīng)一條實(shí)體的變化生成了多條重復(fù)的event記錄,非常不解。
后來google發(fā)現(xiàn),有人也碰到過對應(yīng)的問題,并在Hibernage論壇中提出過這個問題,鑒定為Hibernate的一個小Bug。
(原文地址:http://forum.hibernate.org/viewtopic.php?t=940410&highlight=interceptor+onflushdirty)
解決方法如下:
將FlushMode改為:FlushMode.COMMIT
或者也可以提前進(jìn)行flush()
都可以解決這個問題。
使用一個類繼承Hibernate的EmptyInterceptor類來對程序中的實(shí)體變化進(jìn)行攔截,并在其中的onFlushDirty()函數(shù)中對捕獲的數(shù)據(jù)進(jìn)行處理,產(chǎn)生對應(yīng)的event數(shù)據(jù)并保存到數(shù)據(jù)庫中。 例如:
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)){//如果該實(shí)體需要被記錄,生成對應(yīng)的event。
//此處生成對應(yīng)的event。
}
return false;
}
在程序執(zhí)行后,發(fā)現(xiàn)對應(yīng)一條實(shí)體的變化生成了多條重復(fù)的event記錄,非常不解。
后來google發(fā)現(xiàn),有人也碰到過對應(yīng)的問題,并在Hibernage論壇中提出過這個問題,鑒定為Hibernate的一個小Bug。
(原文地址:http://forum.hibernate.org/viewtopic.php?t=940410&highlight=interceptor+onflushdirty)
解決方法如下:
將FlushMode改為:FlushMode.COMMIT
或者也可以提前進(jìn)行flush()
都可以解決這個問題。