Hibernate BeanのEqualsメソッドのリロードの問題


コードは次のとおりです.

	
	/**
	 *             ,    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はかなり恐ろしいバグを隠しました!!!