2017-03-21 6 views
2

私は、このクラスのAPIバージョン(私がAPI要求のために使用するフィールドのサブセット)を表す1つの一時フィールドを持つ1つの永続クラスを持っています。このフィールドは@Transientです。他のフィールドを使用して簡単に作成できます。クラスフィールドを埋めるためにHibernateコールセッターメソッドを強制する方法は?

私は問題は... Hibernateはフィールドにアクセスするためのクラスとリフレクションをインスタンス化するために、デフォルトの空のコンストラクタを使用していることですので、私はconstrorctorにもsetterメソッドの呼び出し

に私の過渡クラスをインスタンス化することはできません代わりにセッターを使用するために休止状態を強制的にフィールドのゲッター方法をanotateしようとしたが、それは私がフィールド上@Access(AccessType.PROPERTY)を使用しようとした

動作しませんでしたが、それはどのように

を動作しませんでした強制的に休止状態のコールセッターが遭遇したクラスフィールドを埋めるためにうなずきますか?

@Entity 
public class User { 

    @Transient 
    private ApiUser tempUser = new ApiUser(); 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @Access(AccessType.PROPERTY) 
    @Column(nullable = false) 
    private String name; 
    @Access(AccessType.PROPERTY) 
    @Column(nullable = false, unique = true) 
    private String username; 
@Access(AccessType.PROPERTY) 
    @Column(nullable = false) 
    private String userId; 

//lots of others fields// 
public void setUsername(String username) { 
     this.username = username; 
     this.tempUser.setUsername(username); 
    } 
public void setUserId(String userId) { 
     this.userId = userId; 
     this.tempUser.setId(Long.parseLong(userId)); 
    } 

答えて

2

デフォルトでは、アクセスタイプは、識別子注釈(@Id)を置く場所によって定義されます。これをフィールドに置くと、AccessType.PROPERTYになります。これをgetterに置くと、AccessType.FIELDになります。

場合によっては、フィールドではなくプロパティに注釈を付けることが必要な場合があります(ゲッターに任意のロジックを持たせたい場合やそうしたい場合など)。財産。

私が覚えている限り、AccessType.FIELDまたはAccessType.PROPERTYをいずれかのエンティティフィールド/メソッドで指定する場合は、クラス全体のデフォルト動作を指定する必要があります。 AccessType.FIELDがデフォルト値であるにもかかわらず、AccessType.FIELDをクラスレベルで使用する必要があるのはなぜですか。

ここで、phnnumberフィールドに@Transientを設定しないと、JPAによって3列テーブル:

id、 phnnumber、 getphnnumber。 これは、すべてのエンティティフィールド(idおよびphnnumber)にAccessType.FIELDを使用し、同時にgetter(getPhnnumber())にAccessType.PROPERTYを使用するためです。 データベースに2回マッピングされた電話番号で終了します。

したがって、@Transientアノテーションは必須です。つまり、エンティティは、フィールドの値を基になるストレージに保存するのではなく、ゲッターから返される値を格納します。

関連する問題