web-dev-qa-db-ja.com

Hibernate / JPA-Beanメソッドとフィールドのアノテーション

Hibernateの使い方について簡単な質問があります。クラスのフィールドに注釈を付ける方法と、対応するBeanのgetメソッドに注釈を付ける方法の2つの方法のいずれかで、JPA注釈を使用している人々を見続けています。

私の質問は次のとおりです。@ IdなどのJPAアノテーションを使用したアノテーションフィールドとBeanメソッドの間に違いはありますか。

例:

@Entity
public class User
{

**@ID**
private int id;

public int getId(){
return this.id;
}

public void setId(int id){
this.id=id;
}

}

-----------または------------

@Entity
public class User
{


private int id;

**@ID**
public int getId(){
return this.id;
}

public void setId(int id){
this.id=id;
}

}
35
benstpierre

はい、フィールドアクセスとプロパティアクセスを検索したいと思います。

Hibernate Annotations-フィールドまたはプロパティのどちらが良いですか?

Springの設定は field access です。それは私が従うものです。

15
duffymo

はい。フィールドに注釈を付けると、Hibernateはフィールドアクセスを使用してそれらのフィールドを設定および取得します。メソッドに注釈を付けると、hibernateはゲッターとセッターを使用します。 Hibernateは@Idアノテーションの場所に基づいてアクセス方法を選択しますが、私の知る限りでは、組み合わせることはできません。フィールドに@Idで注釈を付けると、メソッドの注釈は無視され、その逆も同様です。クラスレベルのアノテーション@AccessTypeを使用してメソッドを手動で設定することもできます

Hibernate Annotationsリファレンスガイド は、このような質問に非常に役立つリソースであることが証明されており、アクセスタイプが階層をカスケードする方法について詳しく説明しています。

43
Steve Skrla

私の推奨は、メソッドに注釈を付けることです。そうすることで、少し柔軟性が得られます。たとえば、いくつかのクラスがあるとします。

  • AbstractEntity
  • StringIdEntity
  • AutoIdEntity

AbstractEntityは、idフィールド/ getter/setterを定義します。クラスStringIdEntityおよびAutoIdEntityAbstractEntityから継承しますが、異なる_@Id_戦略を使用します。フィールドに注釈を付けると、クラスから別のフィールドに変更できません。

メソッドに注釈を付ける場合は、AbstractEntitygetId()を_@Transient/abstract_としてマークし、サブクラスでメソッドをオーバーライドして、使用する戦略を適用するだけです。私は自分でフィールドに注釈を付けていましたが、これに遭遇し、今後は常にメソッドに注釈を付けることにしました。

したがって、メソッドに注釈を付けることの利点がすぐに分からない場合でも、クラスが非常に多く、切り替えが絶対的な頭痛の種になると、すぐに明らかになる可能性があります。

4
Brian

なぜアクセサーに注釈を付けるのですか?見た目はごちゃごちゃしていて、メンテナンスが面倒です。 JPAまたはHibernateがどのように適用されているかを知るために、クラス全体を探索する必要があります。 Eclipseの一部のHibernateコード生成プラグインを使用する場合、これはデフォルトであり、私を困らせます。

言うまでもなく、アクセサーを使用するもう1つの理由は、プロパティアクセスにロジックを追加したり、親や他のオブジェクトを参照したりするために、前述の注釈とうまく融合しないためです。

3
Joseph Lust

EdgeがプロパティよりもFIELDを使用できるようにするいくつかのディスカッションがあります(- http://Java.dzone.com/tips/12-feb-jpa-20-why-accesstype を参照)。スプリングフレームワークでさえ、プロパティではなくFIELDを使用することを推奨しています(- http://static.springsource.org/spring/docs/2.5.x/reference/orm.html を参照してください)。セッター/ゲッターを実装する必要がないだけでなく、クラスにカスタムタイプのセッター/ゲッターを含めることができるため、FIELDの方がよりクリーンなアプローチであると思います。したがって、より良いカプセル化とよりクリーンなクラス。パフォーマンスに関しては、FIELDはPROPERTYよりも少しエッジがありますが、無視できます。

1行で、PROPERTYよりもFIELDを使用しています。本当に必要な場合はPROPERTYを使用してください。

2
Mohammad Adnan