【问题标题】:JVM crashing when using any other Hibernate inheritance strategy besides SINGLE_TABLE使用除 SINGLE_TABLE 之外的任何其他 Hibernate 继承策略时 JVM 崩溃
【发布时间】:2011-09-27 01:28:11
【问题描述】:

好的,这可能是一个很长的镜头,但这里是。

在 Java (JRE 1.6.0_26-b03) 中,我有两个类,SuperControl 及其子类 SubControl。它们都需要是持久对象,我正在使用 Hibernate Annotations 来实现这一点。我有大约 210 个被正确保存的类。除了一个不是。

我的问题是SubControl 除了SINGLE_TABLE 之外拒绝以任何方式继承。当我说“拒绝”时,我的意思是整个 JRE 崩溃。

这有点问题,因为我真的希望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 崩溃。

@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,完成了几次清理和构建,甚至重新启动了我的机器,但问题仍然存在。

有什么想法吗?我已经为此工作了几个小时,但一无所获。

谢谢!

【问题讨论】:

  • 您的任何误解都不应该导致 JVM 崩溃。 JVM中一定有一个错误。您是否在另一台机器、操作系统和/或 JVM 上尝试过?
  • @JB:还没有。不幸的是,我坚持使用这种架构,所以无论罪魁祸首是什么,我都必须找到解决方法。

标签: java hibernate inheritance single-table-inheritance hibernate-annotations


【解决方案1】:

尝试 Java 1.6.0_20,并检查它是否有效。您发现了一个 JVM 错误,返回 6 个次要版本可能足以让它运行。

你很幸运,这个错误是可重现的,所以创建一个最小的测试用例并将其发布到 Oracle 错误数据库。

【讨论】:

  • 谢谢。我回去了几个版本(六个,在你的敦促下),它运行得很好。早上我会验证 _21 和 _26 之间没有什么太重要的东西出现。是的,一旦我超过了截止日期,我会将此添加到错误报告中。
【解决方案2】:

这看起来像是 5 月初报告的 bug 7042153,又名 2210012。

请注意一位用户提供的解决方法:使用“-server”JVM 选项为他们解决了这个问题。

【讨论】:

  • 还要注意评估:“当我们尝试折叠具有条件参数的 If 参数是对象类型的常量且未加载时,就会出现问题。”这暗示了另一种可能的解决方法:强制预加载问题类,如果你能弄清楚它是什么的话。
  • 感谢 Ed,我尝试使用 -server 运行,但无济于事。幸运的是,没有太多类可能是罪魁祸首,所以也许预加载就可以了。
  • 不要忘记 Hibernate 在启动时动态创建的所有类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 2011-04-08
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多