Hibernate BeanのEqualsメソッドのリロードの問題
コードは次のとおりです.
上記LOC_1ヶ所とLOC_2箇所に印刷されたIDは完全に等しく、LOC_3箇所出力true(説明対象アドレスが同じ)、BUT~~LOC_4箇所出力false;
FlowTokenのequals実装を与える
追跡により,実際にequalsに入ったobjパラメータは外部から伝わったtokenオブジェクトではなく,中間プロセスはHinernateのCGLIBLazyInitializerによってエージェント処理され,下位オブジェクトの変換が発生することが分かった.
最初はみんながこのようなBUGを信じていなかったが、jvmスレッドと変数番号の繰り返し追跡を経て、BUGは毎回再現された.CGLIBLazyInitializerに問題があることを確認したが、国内のインターネットでは同様のケースは見つかっていない.ここで、javaeyeの大牛の討論に供します!
もし私たちのグループの診断が正しいならば、hibernateはかなり恐ろしいバグを隠しました!!!
/**
* , Blocking( )
*
* 1.
* 2.
* 3. token token
* @param token
* @return
*/
public boolean hasBlockingTaskInstances(FlowToken token) {
boolean hasBlockingTasks = false;
System.out.println("LOC_1 :" + token.getId());
Set<TaskInstance> taskInstances = flowInstance.getTaskInstances();
if (taskInstances!=null) {
Iterator<TaskInstance> iter = taskInstances.iterator();
while ( (iter.hasNext()) && (!hasBlockingTasks)) {
System.out.println("LOC_2 : " + taskInstance.getFlowToken().getId());
System.out.println("LOC_3 : " + token == taskInstance.getFlowToken());
System.out.println("LOC_4 : " + token.equals(taskInstance.getFlowToken());
TaskInstance taskInstance = (TaskInstance) iter.next();
if ( (! taskInstance.hasEnded()) //
&& (taskInstance.getIsBlocking()) //
&& (token!=null)
&& (token.equals(taskInstance.getFlowToken())) ) {
hasBlockingTasks = true;
}
}
}
return hasBlockingTasks;
}
上記LOC_1ヶ所とLOC_2箇所に印刷されたIDは完全に等しく、LOC_3箇所出力true(説明対象アドレスが同じ)、BUT~~LOC_4箇所出力false;
FlowTokenのequals実装を与える
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof FlowToken))
return false;
final FlowToken other = (FlowToken) obj;
if (id == null || other.id == null) {
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
追跡により,実際にequalsに入ったobjパラメータは外部から伝わったtokenオブジェクトではなく,中間プロセスはHinernateのCGLIBLazyInitializerによってエージェント処理され,下位オブジェクトの変換が発生することが分かった.
最初はみんながこのようなBUGを信じていなかったが、jvmスレッドと変数番号の繰り返し追跡を経て、BUGは毎回再現された.CGLIBLazyInitializerに問題があることを確認したが、国内のインターネットでは同様のケースは見つかっていない.ここで、javaeyeの大牛の討論に供します!
もし私たちのグループの診断が正しいならば、hibernateはかなり恐ろしいバグを隠しました!!!