Java 这是org.hibernate.internal.SessionImpl中的错误吗?
继承层次结构中的哪一个具体祖先类以下面第“/*3*/”行的测试返回false的方式进行重写Java 这是org.hibernate.internal.SessionImpl中的错误吗?,java,hibernate,Java,Hibernate,继承层次结构中的哪一个具体祖先类以下面第“/*3*/”行的测试返回false的方式进行重写 如果您使用“-ea”-enable assertions-开关运行上述操作,则会在标记为“/*4*/”的行中抛出一个 我找遍了我能想到的任何地方。但据我所知,它似乎没有——它的祖先也没有——超越它 令人费解的是,第“/*2*/”行的计算结果为true,但第“/*3*/”行的计算结果为true 据我所知,“浅”身份检查(“==”)正是默认设置所做的。对吧? 我是在这样的假设下工作的,即在继承层次结构的任
如果您使用“-ea”-enable assertions-开关运行上述操作,则会在标记为“/*4*/”的行中抛出一个 我找遍了我能想到的任何地方。但据我所知,它似乎没有——它的祖先也没有——超越它 令人费解的是,第“/*2*/”行的计算结果为true,但第“/*3*/”行的计算结果为true 据我所知,“浅”身份检查(“==”)正是默认设置所做的。对吧? 我是在这样的假设下工作的,即在继承层次结构的任何地方都不会覆盖默认值 其他人知道为什么上面的调用计算为false吗
顺便说一句,我正在使用Hibernate 4.3.11.Final,这是值得的
更新:-再次感谢@SteveEbersole-。此漏洞已被发现并报告,跟踪地址为。正如@JBNizet在评论中提到的,这是Hibernate使用动态代理的一部分
该漏洞目前仅被标记为影响5.x之前的版本,不再维护该版本。如果您可以验证它是否仍然存在于Hibernate 5.x中,请在bug追踪器上报告。因此,从技术上讲。。。不,不,它不是“org.hibernate.internal.SessionImpl中的bug”。但是,基于线程的当前会话处理如何处理两个会话相等的问题时存在一个错误。我解决了这个问题;查看关于您打开的问题的讨论。执行
System.out.println(aSession.getClass())
“据我所知,“浅”标识检查(“==”)正是默认对象.equals(Object)所做的。对吗?”。否-除基本体外,“==”运算符将仅验证对象是否是完全相同的对象。如果您需要.equals,那么您需要调用.equals@jbniset-System.out.println(aSession.getClass())
printsclass com.sun.proxy.$Proxy14
顺便说一句,我正在使用Hibernate 4.3.11.Final,这是值得的。好的。所以它不是SessionImpl的实例。它是一个动态代理,该代理的调用处理程序决定如何实现equals()。显然,它决定总是返回false。另外@dedumer表示这是“我的工作,不是你的”。。。哇!在你看来,有太多的事情是错误的,以至于你都无法开始进入。拥抱开源精神的方式。谢谢@Douglas。有人告诉我这一定是个真正的bug。谢谢你支持我:,)再次,我使用Hibernate 4.3.11.Final,因为\@Douglas证实了我的假设,我看到了一个真实的bug-实际上回答了我标题中的问题-我会继续接受\@Douglas的答案。不过,我还是要感谢@JBNizet让我了解Hibernate使用代理的情况。这个bug与实体代理有关,而不是与会话代理有关,这两个代理是不相关的。毕竟,@dedupder您使用IBM JVM吗?Douglas提到的bug只有在那里才能重现……FWIW HHH-7528与Hibernate代理JDBC对象有关(很像数据源或JCA),而不是实体代理。只是为了澄清一些混乱。
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 */
}
}