Можно ли сгруппировать повторяющиеся значения внешнего ключа при хранении в JPA? - PullRequest
0 голосов
/ 26 апреля 2019

В моем приложении 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...