[英]JPA Multiple Embedded fields with prefix?
使用 JPA 注释,我想像这样重用相同的嵌入式 object:
@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 的每一列?
谢谢,
泽维尔
如果您想使用多个相同的Embedded
类。 您必须为所有列执行@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;
}
我的建议,如果您的Entity
有一个或多个Embedded
值。 尝试使用@CollectionTable
。
@CollectionTable(name = "EMPLOYEE_ADDRESS", joinColumns = @JoinColumn(name = "ADDRESS_ID"))
private List<Address> addressList;
添加这个对我有用(虽然我使用 hibernate 作为 JPA 提供商)
<property name="hibernate.implicit_naming_strategy" value="org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl" />
有同样的问题,这是解决方案。 完美的工作,前缀字段名称与嵌入属性的名称(在您的情况下homeAddress_和workAddress_)
2022 年(9 年后)@zaw-than-oo -s 的回答仍然有效:-(。
如果有人想改进 jpa-embedded,此“重复”答案仅供参考。
这是一个基于@zaw-than-oo -s 答案的工作跨平台示例,带有详细的 java-jpa 和易于使用的 android-room
@androidx.room.Entity
@javax.persistence.Entity
@javax.persistence.Inheritance(strategy = javax.persistence.InheritanceType.SINGLE_TABLE)
public class AppHardware {
@javax.persistence.Id
@javax.persistence.GeneratedValue(strategy = javax.persistence.GenerationType.AUTO)
@androidx.room.PrimaryKey(autoGenerate = true)
private int id;
// max is embedded without column renaming
@androidx.room.Embedded
@javax.persistence.Embedded
private ProfileCommon max;
// min is embedded with column renaming
@androidx.room.Embedded(prefix = "min")
@javax.persistence.Embedded
@javax.persistence.AttributeOverrides({
// Verbose: every persisted property in ProfileCommon needs an entry
// see https://stackoverflow.com/questions/12912063/jpa-multiple-embedded-fields-with-prefix
@AttributeOverride(name = "added", column = @Column(name = "minadded")),
@AttributeOverride(name = "apkName", column = @Column(name = "minapkName")),
@AttributeOverride(name = "versionCode", column = @Column(name = "minversionCode")),
@AttributeOverride(name = "versionName", column = @Column(name = "minversionName")),
@AttributeOverride(name = "size", column = @Column(name = "minsize"))
})
private ProfileCommon min;
// getter and setter onmitted
}
@javax.persistence.MappedSuperclass
public class ProfileCommon {
private long added; // date
private String apkName;
private long versionCode;
private String versionName;
private long size;
// getter and setter onmitted
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.