4

わかりました、これはおそらくロングショットですが、ここに行きます。

Java (JRE 1.6.0_26-b03) には、2 つのクラスSuperControlとそのサブクラスがありSubControlます。どちらも永続オブジェクトである必要があり、これを実現するために Hibernate Annotations を使用しています。正しく永続化されている約 210 のクラスがあります。1つがそうでないことを除いて。

私の問題は、SubControl以外の方法で継承を拒否することSINGLE_TABLEです。「拒否する」とは、JRE 全体がクラッシュすることを意味します。

SuperControlのマップされたスーパークラスになりたいので、これは少し問題ですSubControlSuperControlそれ自体が永続的なエンティティになることもできます。奇妙なことは、正しく動作する別の場所のコードに正確に並列な階層があることです。

これは私が欲しいものです:

@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 を再起動し、いくつかのクリーン アンド ビルドを実行し、さらにマシンを再起動しましたが、問題は解決していません。

何か案は?私はこれに何時間も取り組んできましたが、どこにも行きませんでした。

ありがとう!

4

2 に答える 2

6

これは、5 月初旬に報告されたバグ 7042153、別名2210012のようです。

あるユーザーによって提供された回避策に注意してください。「-server」JVMオプションを使用すると、それらが修正されました。

于 2011-07-01T22:25:49.770 に答える
3

Java 1.6.0_20を試して、それが機能するかどうかを確認してください。JVMのバグを発見しました。これを実行するには、6つのマイナーバージョンに戻るだけで十分な場合があります。

このバグを再現できるのは幸運なことなので、最小限のテストケースを作成してOracleバグデータベースに投稿してください。

于 2011-07-01T21:43:49.737 に答える