2016-09-09 10 views
0

いくつかのJPAエンティティで@Embeddable Beanを使用して、コード構造と再利用を改善しています。私が思っているのは、@埋め込みオブジェクトのセッターとゲッターを提供する例です。どうして?私はちょうど最終的なフィールドとしてそれらを持っていることを試みた - それはまた、埋め込まれたものが常に存在するので、我々の場合には、意味があります。私が気づいていないこれのいくつかの欠点はありますか?例えば最後の属性として@埋め込みBeans?

:通常それはそのように行われます。

@Entity 
public class Person { 
    @Embedded 
    private final Address address = new Address(); 

    public Address getAddress() { 
     return address; 
    } 
} 
+0

JPAが組み込み可能な豆を設定するという側面もありますが、最終的なものを作ることは少なくとも不愉快です(@NeilStockton http://stackoverflow.com/a/39416643/21499の答えを比較してください)すべてのフィールドがnullの場合はnullになります。http://stackoverflow.com/q/1324266/21499だから、私はまだセッターを削除して、ゲッターにPerson.addressを作成しています。 –

答えて

2

あなたはを保持することはできません。

@Embeddable 
public class Address { 
    // ... 
} 

@Entity 
public class Person { 
    @Embedded 
    private Address address; 

    public void setAddress(Address address) { 
     this.address = address; 
    } 

    public Address getAddress() { 
     return address; 
    } 
} 

は、私はこの方法Personを書くとき、Addressが常にあった場合にも支障がありますfinalまたはstaticフィールドで、埋め込みか非埋め込みかにかかわらず適用されます。 JPAの仕様は、それについては非常に明確であり、異なるJPAプロバイダのためのドキュメントもそうです。

JPA仕様$ 2.1

エンティティ・クラスが最終であってはなりません。エンティティクラスのメソッドまたは永続インスタンス の変数は、最終的なものであってもよい。

+0

ありがとう!困ったことに、とにかく動作します。私はHibernate 5を試しました。これは実際にはここには当てはまりません。結局のところ、Person.addressは永続化されたインスタンス変数としてカウントされてもカウントされなくてもかまいません。Person.address自体ではなく、実際に永続化されている属性だけです。 –

+1

FIELDは、埋め込まれているかどうかにかかわらず、JPAプロバイダによって設定される必要があります。ここで適用されます。それは移植性のために言えることです。 –

+0

OK、私はあなたを信じています。 :-)これは、hibernateがこれを処理するときに何が起こるかを調べたところ、実際には最終フィールドPerson.addressを新しいオブジェクトに変更し、 "final"による保護を無視しているようです。これはうまくいきますが、かなり不快でペルペクシングしているように見えます。これは、BeanをロードするときにPersonのインスタンス化のためにAddressが2回インスタンス化されることを意味します。私は、いつ、どこで私の設定でAddressをインスタンス化するのかはかなり分かりません。 –

関連する問題