В моем приложении Spring Boot две сущности имеют отношения «многие ко многим» друг с другом - «Родитель» и «Ребенок». У меня есть асинхронный процессор, который собирает некоторые данные для создания и хранения родителей. Поскольку я перебираю каждого родителя и строю сущность, я также получаю / строю дочерние сущности и сопоставляю те, которые соответствуют полевой реквизите с Родителями. Проблема в том, что некоторые дочерние объекты имеют одно и то же значение поля для нескольких родительских полей, поэтому, когда я сохраняю все заполненные родительские объекты в конце, у меня появляется много повторяющихся значений полей в моей дочерней таблице в базе данных. Есть ли способ сообщить JPA, что дублирующиеся значения Child.field должны быть сгруппированы, а таблица сопоставления между Parent и Child должна указывать на правильные идентификаторы?
Родительский субъект:
@Entity
public class ParentEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "field")
private String field;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "mapping",
joinColumns = @JoinColumn(name = "parent_id"),
inverseJoinColumns = @JoinColumn(name = "child_id"))
private List<ChildEntity> children;
public List<ChildEntity> getChildren() {
return this.children
}
public void setChildren(List<ChildEntity> children){
this.children = children
}
}
И мой ребенок:
@Entity
public class ChildEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "field")
private String field;
@ManyToMany(mappedBy = "children")
private List<ParentEntity> parents;
public String getField() {
return this.field;
}
public List<ParentEntity> getParents() {
return this.parents
}
public void setParents(List<ParentEntity> parents){
this.parents = parents
}
}
И немного логики обработки:
List<ParentEntity> parentList = new ArrayList<>();
someResponseData.forEach(d -> {
ParentEntity parent = mapper.dataToParent(d);
// children data coming from api call
List<ChildEntity> children = someProcessor.buildChildrenByField(parent.getField());
parent.setChildren(children);
parentList.add(parent);
});
parentRepo.saveAll(parentList);