Java 如何基于父级动态生成JPA Id列?
我有一个JSON文件,看起来像这样Java 如何基于父级动态生成JPA Id列?,java,jpa,jackson,jackson-dataformat-xml,Java,Jpa,Jackson,Jackson Dataformat Xml,我有一个JSON文件,看起来像这样 { "accountId": "123", "parties":[ { "name": "John Doe" } ] } 我可以用类似于 public class Account{ private String id; @JsonProperty("parties") private Li
{
"accountId": "123",
"parties":[
{
"name": "John Doe"
}
]
}
我可以用类似于
public class Account{
private String id;
@JsonProperty("parties")
private List<Party> parties;
}
public class Party{
private String name;
}
公共类帐户{
私有字符串id;
@JsonProperty(“双方”)
私人名单缔约方;
}
公营党{
私有字符串名称;
}
但是,SQL表参与方包含一个复合键作为ID。这是一个名称和父帐户ID的复合键。有没有一种方法可以在不使用单独类的情况下执行此操作?我试过这个
@JsonBackReference
private Account parent;
public class GetIdConverter implements AttributeConverter<String, String> {
@Override
public String convertToDatabaseColumn(String b) {
if(parent == null){
logger.error("couldn't find the parent");
}
return parent.getId();
}
@Override
public String convertToEntityAttribute(String s) {
return s;
}
}
@JsonBackReference
私人账户母公司;
公共类GetIdConverter实现AttributeConverter{
@凌驾
公共字符串convertToDatabaseColumn(字符串b){
如果(父项==null){
logger.error(“找不到父项”);
}
返回parent.getId();
}
@凌驾
公共字符串convertToEntityAttribute(字符串s){
返回s;
}
}
但当我尝试插入时,我得到
IdentifierGenerationException:在调用save()之前,必须手动分配此类的ID
不幸的是,在JPA中定义复合键只有两个选项:
@IdClass
和@EmbeddedId
注释,在这两种情况下,我们必须创建一个单独的类。为复合类创建类背后的基本思想是理解我们的键包含多个主键字段,并将此对象视为原子对象。将复合键作为类的思想使得在任何实现JPA的结构中使用实体键都很容易
与此选项类似,您可以将两个类合并为一个实体:
@Entity
@Table
@IdClass(PartyEntity.PartyId.class)
public class PartyEntity {
public static class PartyId implements Serializable {
private String accountId;
private String name;
public PartyId() {
}
public PartyId(String accountId, String name) {
this.accountId = accountId;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PartyId)) return false;
PartyId partyId = (PartyId) o;
return Objects.equals(accountId, partyId.accountId) &&
Objects.equals(name, partyId.name);
}
@Override
public int hashCode() {
return Objects.hash(accountId, name);
}
}
@Id
private String accountId;
@Id
private String name;
//getters and setters
}
对saver的答案稍作改进-您可以尝试以下映射:
public class Account{
private String id;
@JsonProperty("parties")
@JsonManagedReference
private List<Party> parties;
}
@IdClass(PartyEntity.PartyId.class)
public class Party {
@JsonBackReference
@Id
@ManyToOne
private Account account;
@Id
private String name;
}
公共类帐户{
私有字符串id;
@JsonProperty(“双方”)
@JsonManagedReference
私人名单缔约方;
}
@IdClass(PartyEntity.PartyId.class)
公营党{
@JsonBackReference
@身份证
@许多酮
私人帐户;
@身份证
私有字符串名称;
}
请参阅的“派生标识符示例”部分中的第一个示例。很抱歉,您还没有时间尝试此操作,但希望今天就开始,谢谢!