3

ゲッターメソッドと関連するフィールドに直接アノテーションを付けること(例として@idを取り上げます)の間に違いがあるかどうかを理解しようとしています。フィールドにアノテーションを付ける場合、JPAは対応するゲッターを呼び出すために何らかのリフレクションを使用しますか?私の場合、エンティティクラスを難読化しようとしているので、ゲッターの名前がaaa()のように変更されるため、ビジネスロジックを維持する方法を探しています。

4

2 に答える 2

7

JPA2仕様のセクション2.3.1の内容は次のとおりです。

デフォルトでは、単一のアクセスタイプ(フィールドまたはプロパティアクセス)がエンティティ階層に適用されます。エンティティ階層のデフォルトのアクセスタイプは、アクセスタイプを明示的に指定しないエンティティクラスおよびエンティティ階層のマップされたスーパークラスの属性にマッピングアノテーションを配置することによって決定されます。アクセスタイプは、セクション2.3.2で説明されているように、Accessアノテーション[6]によって明示的に指定されます。注釈を使用してデフォルトのアクセスタイプを定義する場合、エンティティクラスの永続フィールドまたは永続プロパティのいずれかにマッピング注釈を配置すると、アクセスタイプがそれぞれフィールドベースまたはプロパティベースのアクセスとして指定されます。

  • フィールドベースのアクセスが使用される場合、エンティティクラスのオブジェクト/リレーショナルマッピングアノテーションはインスタンス変数にアノテーションを付け、永続性プロバイダーランタイムはインスタンス変数に直接アクセスします。トランジェントアノテーションが付けられていないすべての非トランジェントインスタンス変数は永続的です。
  • プロパティベースのアクセスが使用される場合、エンティティクラスのオブジェクト/リレーショナルマッピングアノテーションはgetterプロパティアクセサー[7]にアノテーションを付け、永続プロバイダーランタイムはプロパティアクセサーメソッドを介して永続状態にアクセスします。Transientアノテーションが付けられていないすべてのプロパティは永続的です。
  • マッピング注釈は、一時的または一時的であるフィールドまたはプロパティに適用してはなりません。

アクセスタイプがこのようにデフォルト設定されているエンティティ階層内のそのようなクラスはすべて、フィールドまたはプロパティのいずれかに注釈を配置する際に一貫している必要があります。これにより、単一の一貫したデフォルトアクセスタイプが階層内に適用されます。このようなクラスで使用される埋め込み可能なクラスは、Accessアノテーションが以下に定義されているように指定されていない限り、階層のデフォルトのアクセスタイプと同じアクセスタイプになります。デフォルトのアクセスタイプを判別できず、アクセスタイプが注釈またはXML記述子によって明示的に指定されていない場合はエラーになります。Accessアノテーションを明示的に指定せずに、エンティティ階層内のフィールドとプロパティにアノテーションを配置するアプリケーションの動作は定義されていません。

したがって、難読化の問題を回避したい場合は、ゲッターではなくフィールドに一貫して注釈を付けるか、@Accessアノテーションを使用してフィールドアクセスタイプを強制します。

于 2012-04-17T09:57:33.203 に答える
6

JPAでは、永続クラスのデータへの2種類のアクセスが可能です。インスタンス変数(フィールド)をデータベース内の列にマップすることを意味するフィールドアクセスと、データベースにマップされるプロパティ名を決定するためにゲッターを使用することを意味するプロパティアクセス。使用するアクセスタイプは、@ Idアノテーションをどこに配置するか(idフィールドまたはgetId()メソッド)によって決まります。

于 2013-03-12T08:57:10.940 に答える