14

Hibernate Enversを使用しており、次の状況があります。

:を参照するクラスBusinessObjectTypeとクラスIdentityBusinessObjectType

@Entity
@Table( name = "ID_IDENTITY" )
@Audited
public class Identity {

    @ManyToOne
    @JoinColumn( name = "BO_TYPE_ID" )
    @IndexColumn( name = "INDEX_BO_BO_TYPE" )
    private BusinessObjectType businessObjectType;

    […]

}

次に、Identityのすべてのバージョンを次のようにクエリします。

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

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

BusinessObjectType保存されたIDに(つまり、 nullであった)がない場合、businessObjectTypeすべてが魅力のように機能します。

IDbusinessObjectType != nullに「JavassistEnhancementfailed」の例外がある場合:

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

このエラーは、EnversがBusinessObjectTypeをインスタンス化しようとしていることに関連しているようですが、問題が何であるかはわかりません(AuditQueryを使用しない場合、Hibernateは両方のオブジェクトに問題はありません)。

例外の原因は

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

スタックトレースなし。

問題が何であるかについてのヒントはありますか?

4

2 に答える 2

21

これは、次のクラス内で発生します。 JavassistLazyInitializer Javassist ベースの遅延初期化プロキシ。

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

  • @ManyToOne 関係の遅延読み込みをオフにする [これは設計上の決定であるため、全体的なソリューションに適合しない場合は注意してください]
  • 問題を引き起こしているエンティティのデフォルトのパブリックコンストラクターを提供します[これは簡単です]
  • hibernate.bytecode.use_reflection_optimizerプロパティを falseに設定して、実際に必要でない場合は反射の最適化をオフ にします

これが役立つかどうかお知らせください

于 2011-09-10T17:38:43.737 に答える
1

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

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

于 2011-09-11T06:44:00.083 に答える