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;
}
}
はい、フィールドアクセスとプロパティアクセスを検索したいと思います。
Hibernate Annotations-フィールドまたはプロパティのどちらが良いですか?
Springの設定は field access です。それは私が従うものです。
はい。フィールドに注釈を付けると、Hibernateはフィールドアクセスを使用してそれらのフィールドを設定および取得します。メソッドに注釈を付けると、hibernateはゲッターとセッターを使用します。 Hibernateは@Id
アノテーションの場所に基づいてアクセス方法を選択しますが、私の知る限りでは、組み合わせることはできません。フィールドに@Id
で注釈を付けると、メソッドの注釈は無視され、その逆も同様です。クラスレベルのアノテーション@AccessType
を使用してメソッドを手動で設定することもできます
Hibernate Annotationsリファレンスガイド は、このような質問に非常に役立つリソースであることが証明されており、アクセスタイプが階層をカスケードする方法について詳しく説明しています。
私の推奨は、メソッドに注釈を付けることです。そうすることで、少し柔軟性が得られます。たとえば、いくつかのクラスがあるとします。
AbstractEntity
StringIdEntity
AutoIdEntity
AbstractEntity
は、idフィールド/ getter/setterを定義します。クラスStringIdEntity
およびAutoIdEntity
はAbstractEntity
から継承しますが、異なる_@Id
_戦略を使用します。フィールドに注釈を付けると、クラスから別のフィールドに変更できません。
メソッドに注釈を付ける場合は、AbstractEntity
でgetId()
を_@Transient/abstract
_としてマークし、サブクラスでメソッドをオーバーライドして、使用する戦略を適用するだけです。私は自分でフィールドに注釈を付けていましたが、これに遭遇し、今後は常にメソッドに注釈を付けることにしました。
したがって、メソッドに注釈を付けることの利点がすぐに分からない場合でも、クラスが非常に多く、切り替えが絶対的な頭痛の種になると、すぐに明らかになる可能性があります。
なぜアクセサーに注釈を付けるのですか?見た目はごちゃごちゃしていて、メンテナンスが面倒です。 JPAまたはHibernateがどのように適用されているかを知るために、クラス全体を探索する必要があります。 Eclipseの一部のHibernateコード生成プラグインを使用する場合、これはデフォルトであり、私を困らせます。
言うまでもなく、アクセサーを使用するもう1つの理由は、プロパティアクセスにロジックを追加したり、親や他のオブジェクトを参照したりするために、前述の注釈とうまく融合しないためです。
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を使用してください。