带有前缀的JPA Multiple Embedded字段?

xno*_*pre 25 java annotations jpa

使用JPA annoations,我想重用相同的嵌入对象,如下所示:

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

    @Embedded
    public Address workAddress;
}

@Embeddable
public class Address {
    public String code;
    public String city;
    ...
} 
Run Code Online (Sandbox Code Playgroud)

我可以使用@AttributeOverrides,@ AttributeOverride和@Column指定SQL列名,但它是verbos.是否可以仅为homeAddress和workAddress指定要添加到每列的前缀?

谢谢,

泽维尔

Zaw*_* oo 8

如果你想使用多个相同的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;  

}   
Run Code Online (Sandbox Code Playgroud)

我的建议,如果Embedded你的一个或多个价值Entity.尝试使用@CollectionTable.

@CollectionTable(name = "EMPLOYEE_ADDRESS", joinColumns = @JoinColumn(name = "ADDRESS_ID"))
private List<Address> addressList;
Run Code Online (Sandbox Code Playgroud)

参考JPA CollectionTable

  • 谢谢,我知道这个解决方案,但它很冗长.有没有更简洁的解决方案,例如使用"前缀"或"后缀"(在您的示例中为"_1"或"_2")之类的东西? (13认同)

Mah*_*hes 5

添加这个对我有用(尽管我使用 hibernate 作为 JPA 提供程序)

<property name="hibernate.implicit_naming_strategy" value="org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl" />
Run Code Online (Sandbox Code Playgroud)

  • 在 Spring Boot (2.3.6) 中,这是: `spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl` (5认同)