Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何基于父级动态生成JPA Id列?_Java_Jpa_Jackson_Jackson Dataformat Xml - Fatal编程技术网

Java 如何基于父级动态生成JPA Id列?

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

我有一个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;
}
公共类帐户{
私有字符串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
@身份证
@许多酮
私人帐户;
@身份证
私有字符串名称;
}

请参阅

的“派生标识符示例”部分中的第一个示例。很抱歉,您还没有时间尝试此操作,但希望今天就开始,谢谢!