2016-04-22 10 views
1

ほとんどの場合、gettersとsetterはIDEによって生成されるため、フィールドに注釈を付ける必要があります。 識別子フィールドに@Idと注釈を付けると、エンティティのアクセス方法はフィールドベースになります。しかし、私はgetId()を呼び出すと、エンティティが遅延ロードされている場合に、怠惰な初期化例外を取得したくありません。JPA - アクセスストラテジー

フィールドに注釈を付ける必要がありますが、プロパティベースのアクセス戦略も必要です。どうやってやるの?

私は私のエンティティクラスの上に@Access(AccessType.PROPERTY)を置いたが、その後、私のJPAプロバイダ、すなわち休止、JPAキャッシュ機能を見てみorg.hibernate.AnnotationException: No identifier specified for entity: ...

+1

もう少し説明してください。なぜこれが必要ですか?プロパティ/フィールドアクセスは、JPAプロバイダがエンティティやアノテーションにどのようにアクセスするかを定義します。アプリケーションの動作ではなく、遅延初期化の問題には関係しません。 – Chris

+0

エンティティまたはそのサンプルを投稿できますか?それ以外の場合は、問題が発生している理由を推測することは困難です。 – ujulu

+0

@Chris、注釈はフィールド上にあるので、hibernateはフィールドにアクセスしますが、idは通常privateであるため、他のクラスはgetId()を呼び出します。エンティティが遅延ロードされている場合、例外が発生します。私はフィールドに注釈を残したいが、問題なくgetIdを呼び出せるようにする。これはidフィールドのためのものです。 – Ramazan

答えて

0

プロバイダが唯一の注釈のためのエンティティにアクセスするためのプロパティを確認します、そしてそれは、フィールド注釈を無視すべきです。

@Access(AccessType.PROPERTY)アノテーションは、メソッドやフィールドでも使用でき、別のものを使用することができます。 @Access(AccessType.PROPERTY)アノテーションを付けてアノテーションをフィールドに追加し続けると、プロバイダはアノテーションをピックアップしても、そのプロパティを使用してエンティティの値にアクセスします。

コメントに記載されているとおり、これは遅延設定に影響しません。

0

をスローし、これはあなたがコレクションを返すとidまたはフィールドで見つけることができます。 AccessTypeライブラリを使用すると、特定のエンティティ・マネージャを遅延的にまたは熱心に検索するように構成できます。エンティティに@Access(AccessType.PROPERTY)を指定

http://www.objectdb.com/java/jpa/persistence/cache