好的,这可能是一个远景,但这是可行的。
在Java(JRE 1.6.0_26-b03)中,我有两个类SuperControl及其子类SubControl。它们都需要是持久性对象,而我正在使用Hibernate Annotations来实现此目的。我大约有210个可以正确持久保存的类。除了一个不是。
SuperControl
SubControl
我的问题是,SubControl除了以外,我拒绝以任何方式继承SINGLE_TABLE。当我说“拒绝”时,我的意思是 整个JRE崩溃 。
SINGLE_TABLE
这有点问题,因为我真的很想SuperControl成为的映射超类SubControl。SuperControl本身也可以是一个持久实体。奇怪的是,我在其他地方的代码中有一个完全并行的层次结构,可以正常工作。
这就是我要的:
@Entity @MappedSuperclass public class SuperControl extends ItsSuperClass { // ... } @Entity public class SubControl extends SuperControl { // ... }
但它炸毁了错误
# # A fatal error has been detected by the Java Runtime Environment: # # Internal Error (c1_Optimizer.cpp:271), pid=5456, tid=1260 # guarantee(x_compare_res != Constant::not_comparable) failed: incomparable constants in IfOp # # JRE version: 6.0_26-b03 # Java VM: Java HotSpot(TM) Client VM (20.1-b02 mixed mode, sharing windows-x86 ) # An error report file with more information is saved as: # C:\eclipse\hs_err_pid5456.log
在不提供任何继承提示的情况下,Hibernate默认为SINGLE_TABLE(由于创建了DTYPE列,我可以告诉它)。我可以明确指定它,而不会导致JVM崩溃。
DTYPE
@Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) public class SuperControl extends ItsSuperClass { // ... } @Entity public class SubControl extends SuperControl { // ... }
最糟糕的部分是,如果我完全删除SubControl该类,或者甚至仅删除hibernate.cfg.xml文件中的类映射,JVM 仍然会 崩溃。这使我相信SuperControl和之间存在某种隐藏的联系SubControl。也许某些东西被缓存在Eclipse之类的东西中。我已经重新启动了Eclipse,完成了几次清理和构建,甚至重新启动了我的机器,问题仍然存在。
有任何想法吗?我已经为此工作了几个小时,却一无所获。
谢谢!
尝试使用Java 1.6.0_20,然后检查是否可行。您已经找到一个JVM错误,并且回溯6个次要版本可能足以使它运行。
您很幸运可以重现此错误,因此请创建一个最小的测试用例并将其发布到Oracle错误数据库。