这是org.hibernate.internal.SessionImpl中的错误吗?

时间:2016-08-25 22:32:08

标签: java hibernate

org.hibernate.internal.SessionImpl 继承层次结构中的具体祖先类覆盖 Object.equals(Object) ,以便在“/ * <”行进行测试em> 3 * /“下面返回false?

package deduper;

import org.hibernate.*;

public class SessionEqualsPuzzler { 

    public static void main( String... fubar ){

        Session aSession  /* = ... Get a valid session instance from SessionFactory... */; /* 1 */

        assert ( aSession == aSession ) : "This error message WILL NEVER be shown..."; /* 2 */

        boolean isEqual = aSession.equals( aSession ); /* 3 */

        assert ( isEqual  ) : "This error message SHOULD never be shown — but it is anyway for some unknown reason...: " + isEqual; /* 4 */

    }

}

如果您使用“ -ea ”运行上述内容 - 启用断言 - 切换,则会有 AssertionError 抛出标有“/ * 4 * /”的行。

我搜遍了我能想到的每一个地方。但据我所知, SessionImpl 似乎不是 - 也不是它的任何祖先 - 覆盖 {{3} }

令人费解的是,行“/ * 2 * /”评估为true,但行“/ * 3 * /”没有!

据我了解,“”身份检查(“==”)正是默认 Object.equals(Object) 所做的。正确?

我的工作是假设 Object.equals(Object) 没有在其继承层次结构的任何地方覆盖默认的 SessionImpl

是否有其他人知道为什么上面的 Object.equals(Object) 调用评估为false?

顺便说一下,我正在使用Hibernate 4.3.11.Final,因为它值得。

更新 SessionImpl.equals(Object) - 再次感谢@SteveEbersole - Hibernate have acknowledged the existence of the bug, resolved it super quickly

2 个答案:

答案 0 :(得分:1)

所以,技术上......不。不,它不是“org.hibernate.internal.SessionImpl中的错误”。然而,基于线程的当前会话处理如何处理2个会话相等的问题存在一个错误。我修好了;请参阅您打开的HHH-11067问题的讨论。

答案 1 :(得分:0)

此错误已知并已报告,已在https://hibernate.atlassian.net/browse/HHH-7528进行跟踪。正如@JBNizet在评论中提到的那样,它是Hibernate使用动态代理的一部分。

该错误目前仅标记为影响5.x之前的版本,不再维护该版本。如果您可以验证它是否仍然存在于Hibernate 5.x中,请在错误跟踪器上报告。