8

Spring Framework アプリケーションでHibernate を JPA プロバイダー (EntityManagerFactory代わりに itsを使用しています) として使用しています。SessionFactorySpring Framework の読み込み時間の織り込みサポートが機能するようになったので、そのハードルを超えました。

エンティティのプロパティbyte[]とプロパティの遅延読み込みを有効にする必要があります。Hibernate の ant タスクを使用してビルド@ManyToOne時にエンティティをインストルメント化 (ウィービング) する方法は理解していますが、代わりに実行時にエンティティをインストルメント化(ロード時ウィービング)したいと考えています。いくつかの Google 検索結果で への参照を見てきましたが、それを有効にするための実際の手順はありません。実行時にエンティティを計測できるように Hibernate に指示するには、どのプロパティを設定する必要がありますか?

4

2 に答える 2

25

コードをかなり読んでデバッグした後、私はこれを理解しました。Hibernate ORM のドキュメントにこの情報が含まれていないのは残念です。(公平を期すために、Hibernate EntityManager のドキュメントには記載されていますが、簡単には見つかりません。「遅延プロパティ フェッチの使用」に関する Hibernate の説明では、「遅延プロパティの読み込みにはビルド時のバイトコード インストルメンテーションが必要です。」とのみ記載されています。ランタイムインストルメンテーションを使用できることについては言及されていませ。 Hibernate EntityManager プロパティを使用します。)

最初に行う必要があるのは、"hibernate.ejb.use_class_enhancer"JPA プロパティを"true"( String) に設定することです。addTransformerこれにより、HibernateはPersistenceUnitInfoインスタンスを呼び出して「アプリケーション サーバー」クラス変換を使用できることを伝えます。「アプリケーション サーバー」クラスの変換は、まさに Spring のLoadTimeWeaver. Spring の Java 構成と を使用しており、Hibernate がコンパイル時の依存関係である場合は、文字列リテラルの代わりに定数をLocalContainerEntityManagerFactoryBean使用できます(これにより、タイプミスが防止されます)。AvailableSettings.USE_CLASS_ENHANCER"hibernate.ejb.use_class_enhancer"

Spring の Java 構成を使用している場合は、SPR-10856が修正されるまで、追加の手順を実行する必要があります。LocalContainerEntityManagerFactoryBeansetLoadTimeWeaverメソッドは本来あるべきように自動的に呼び出されないため、手動で呼び出す必要があります。あなたの@Configurationクラスでは、単にまたは@Injectインスタンスを作成し、.@AutowireLoadTimeWeaversetLoadTimeWeaverLocalContainerEntityManagerFactoryBean

これらの手順を実行すると、Tomcat の Spring Framework で Hibernate のランタイム エンティティ バイトコード インストルメンテーションを使用できるようになります。

于 2013-08-24T22:19:02.320 に答える
-1

同様の問題があります。あなたが言及した手順に従って、ウィーバーを正常にセットアップしました。注釈付きの byte buddy を使用してランタイム エンティティを作成しました。そして、実行時にこのクラスをロードします。リフレクションを使用して同じインスタンスを作成し、永続化を試みました。しかし、休止状態は次のように不平を言います。

java.lang.IllegalArgumentException: Unknown entity:

私が作成した実行時エンティティは強化されておらず、休止状態も同じことを訴えていると思います。

于 2017-01-20T11:32:53.103 に答える