2011-09-01 9 views
10

を「Javassistの強化に失敗しました」 IDのすべてのバージョンについて:休止Enversと私たちは、次のような状況を休止Enversを使用して持っている例外

AuditQuery auditQuery = auditReader.createQuery().forRevisionsOfEntity(
    Identity.class, 
    false, 
    true); 
auditQuery.add(AuditEntity.id().eq(dbid)); 

@SuppressWarnings("unchecked") 
List< Object[]> history = (List< Object[]>) auditQuery.getResultList(); 

保存されたIDにBusinessObjectType(つまり、businessObjectTypeはnullで、すべてが魅力的です)

アイデンティティがbusinessObjectType != nullは、我々の例外を「Javassistの強化に失敗しました」を取得した場合:

Javassist Enhancement failed: ch.ethz.id.wai.baseclasses.BusinessObjectType 

エラーがBusinessObjectTypeをインスタンス化しようとしているEnversに関連しているようだが、私は本当に何の問題が表示されません(AuditQueryを使用しない場合、Hibernateは両方のオブジェクトに問題はありません)。

例外の原因は、スタックトレースを持たない

java.lang.InstantiationException: ch.ethz.id.wai.baseclasses.BusinessObjectType_$$_javassist_49 

です。

問題の原因は何ですか?

答えて

14

これは、次のクラス内で発生します。JavassistLazyInitializer Javassistベースの遅延イニシャライザプロキシです。

完全なソースを見ることなく、コメントするのは難しいですが、オプションを試してみることができます。

    は@ManyToOne関係のための遅延読み込みをオフにし
  • [これは、全体的なソリューションに収まらない場合はそう気を付ける設計上の決定である]の問題を引き起こしているエンティティの既定のパブリックコンストラクタを提供する
  • 本当に偽

hibernate.bytecode.use_reflection_optimizerプロパティを設定することにより、必要とされていない場合 は反射の最適化をオフに

  • [これは簡単です]これは

    を助け場合はお知らせ
  • +0

    フェッチがデフォルトです。SELECT。コンストラクタは公開されていませんでした。ありがとう。私は、なぜEnversがプレーンなHibernateよりも多くのインスタンスを生成したいのか理解しなければなりません。 – Matteo

    +0

    なぜデフォルトのコンストラクタを 'public'にする必要がありますか?私は、同じ容疑者を持っている潜在的に矛盾する答えは[こちら](http://stackoverflow.com/questions/2935826/why-does-hibernate-require-no-argument-constructor#comment9688725_2971717) –

    1

    例外の詳細については、IDEのデバッグ機能を使用して、基本例外が発生したときに実行を中止するための例外ブレークポイントをjava.lang.InstantiationExceptionに設定してください。これにより、完全なスタックトレースが表示され、スタック上のすべての変数を検査できるようになります。

    私が推測しなければならないのは、 BusinessObjectTypeへの関連付けが怠惰にマップされていないため、単純な休止状態がクラスのプロキシーを作成しようとしていないことです。対照的にエニバはそうするように見える。プロキシは、実行時に生成されたサブクラスで、すべてのパブリックメソッドをオーバーライドします。したがって、クラスやpublicメソッド(Objectから継承されたもののいずれでも)はfinalと宣言できず、デフォルトのコンストラクタにサブクラスからアクセス可能でなければなりません。

    +0

    を参照してください。Enversは、より多くを取得しようとします(そうでないとエラーは発生しません)。 1つの問題は、なぜですか?どうすればそれを避けることができますか?一方、BusinessObjectTypeには、デフォルトのパブリックコンストラクタがあり、最終フィールドはありません。プレーンなエンバーでは問題なくフェッチできます。 – Matteo

    +0

    ...最終的な方法もありませんか?私はEnversの内部についてさらに推測することは十分に分かっていません。だから私は詳細な情報を得るためにデバッグを開始するのです。 – meriton

    +0

    実際、私は最後にテストを変更したときにコンストラクタをprivateにしていたことに気付かなかった。ところで:公共のコンストラクタで決勝のメソッドが動作するようです。ありがとう! – Matteo

    関連する問題