gpt4 book ai didi

java - 如何根据父级动态生成 JPA Id 列?

转载 作者:行者123 更新时间:2023-12-04 15:02:18 25 4
gpt4 key购买 nike

我有一个看起来像这样的 JSON 文件......

{
"accountId": "123",
"parties":[
{
"name": "John Doe"
}
]
}

我可以使用类似的东西解析这个问题

public class Account{
private String id;
@JsonProperty("parties")
private List<Party> parties;
}

public class Party{
private String name;
}

但是,SQL 表 PARTY 包含一个复合键作为 ID。这是姓名和 parent 帐户 ID 的复合键。有没有办法不用单独的类(class)就可以做到这一点?我试过这个...

@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;
}
}

但是当我尝试插入时我得到...

IdentifierGenerationException: ids for this class must be manually assigned before calling save()

最佳答案

不幸的是,在 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
}

关于java - 如何根据父级动态生成 JPA Id 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66768523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com