当父项在桌子上时,我试图更新或插入子项实体。 但是我没有父实体的ID 只有一个名称。 在父表上,我有两个ID约束PK和名称唯一约束。
@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Parent{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@NaturalId
private String name;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Child> childrens;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Parent)) return false;
Parent that = (Parent) o;
return Objects.equals(name, that.name);
}
@Override
public int hashCode() {
return 31;
}
}
子表
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Child{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(unique = true)
private String name;
private String description;
}
然后通过将SpringData与JpaRepository结合使用,我想使用保存方法parentRepository.save(List<Parent> parents)
插入新的子项。
当我添加新数据时,它仅在首次保存时起作用-父母与孩子在一起。但是当我想更新新孩子的父母时,我得到了例外:
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "parent_parent_name_key"
。密钥(名称)=(某些名称)已存在。
我使用POSTGRESQL
有没有办法配置它?或只有一种解决方案是按名称加载所有Parents,然后更新java对象上的所有内容