web-dev-qa-db-ja.com

プレフィックス付きのJPA複数の埋め込みフィールド?

JPAアノテーションを使用して、次のような同じ埋め込みオブジェクトを再利用したいと思います。

@Entity
public class User {
    @Embedded
    public Address homeAddress;

    @Embedded
    public Address workAddress;
}

@Embeddable
public class Address {
    public String code;
    public String city;
    ...
} 

@ AttributeOverrides、@ AttributeOverride、@ ColumnでSQL列名を指定できますが、それは動詞です。 homeAddressとworkAddressの各列に追加するプレフィックスだけを指定することは可能ですか?

ありがとう、

ザビエル

26
xnopre

複数の同じEmbeddedクラスを使用したい場合。すべての列に対して@AttributeOverridesを実行する必要があります。以下のようにしてみてください。

参照 JPA AttributeOverrides

@Embeddable
public class Address {
    private String state;
    @Column(name = "Zip_code")
    private String Zip;
}

@Entity(name = "Employee")
public class Employee implements Serializable {
    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name = "state", column = @Column(name = "province_1")),                       
        @AttributeOverride(name = "Zip", column = @Column(name = "postal_code_2"))
    })
    private Address address_1;  

    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name = "state", column = @Column(name = "province_2")),                       
        @AttributeOverride(name = "Zip", column = @Column(name = "postal_code_2"))
    })
    private Address address_2;  

}   

Embeddedに1つ以上のEntity値がある場合の私の提案。 @CollectionTableを使用してみてください。

@CollectionTable(name = "EMPLOYEE_ADDRESS", joinColumns = @JoinColumn(name = "ADDRESS_ID"))
private List<Address> addressList;

参照 JPA CollectionTable

8
Zaw Than oo

同じ問題があります、ここに解決策があります。完璧に機能し、フィールド名の前に埋め込みプロパティの名前(この場合はhomeAddress_とworkAddress_)を付けます

https://stackoverflow.com/a/3046725/4252764

3
Vuk Djapic

これを追加するとうまくいきます(ただし、JPAプロバイダーとしてhibernateを使用しています)

<property name="hibernate.implicit_naming_strategy" value="org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl" />
0
Mahes