Stack overflow при маппинге JPA-DTO при отношении one/many to one/many

90
06 мая 2021, 01:50

Суть в том, что есть неких 2 класса А и Б. Поскольку есть отношение, то соответственно класс А ссылается на Б и наоборот. Для обоих классов есть DTO и JPA реализация. Есть соответственно маппер для всего этого дела (в моём случае в конструкторе, но не столь важно). И получается следующая ситуация с маппингом: вызываем маппер А_DTO в А_JPA, в следствии чего для поля Б_DTO вызывается Б_DTO в Б_JPA, у которого в свою очередь есть поле А_DTO и так далее, в следствии чего выпадает stack overflow и все падает. Как избавиться от подобной зависимости? Пример кода (аннотации и лишние поля убрал, ломбок стоит):

public abstract class Template implements Serializable {
    protected Template(Template templateFrom) {
        setTemplateGroup(templateFrom.getTemplateGroup());
    }
    public abstract TemplateGroup getTemplateGroup();
    public abstract void setTemplateGroup(TemplateGroup template);
}
public class TemplateDTO extends Template {
    private TemplateGroup templateGroup;
    public TemplateDTO(Template templateFrom) {
        super(templateFrom);
    }
    public TemplateGroup getTemplateGroup() {
        return templateGroup;
    }
}
public class TemplateJPA extends Template {
    private TemplateGroupJPA templateGroup;
    public TemplateJPA(Template templateFrom) {
        super(templateFrom);
    }
    @Override
    public void setTemplateGroup(TemplateGroup templateGroup) {
        if (templateGroup == null) {
            this.templateGroup = null;
            return;
        }
        this.templateGroup = new TemplateGroupJPA(templateGroup);
    }
}
////////////////////////////////////////
public abstract class TemplateGroup implements Serializable {
    protected TemplateGroup(TemplateGroup from) {
        setTemplates(from.getTemplates());
    }
    public abstract Set<Template> getTemplates();
    public abstract void setTemplates(Set<Template> templates);
}
public class TemplateGroupDTO extends TemplateGroup {
    private Set<TemplateDTO> templates;
    public TemplateGroupDTO(TemplateGroup from) {
        super(from);
    }
    @Override
    public Set<Template> getTemplates() {
        return (templates == null) ? null : new HashSet<>(templates);
    }
    @Override
    public void setTemplates(Set<Template> templates) {
        this.templates = (templates == null) ? null
                : templates.stream().map(TemplateDTO::new).collect(Collectors.toSet());
    }
}
public class TemplateGroupJPA extends TemplateGroup {
    private Set<TemplateJPA> templates;
    public TemplateGroupJPA(TemplateGroup from) {
        super(from);
    }
    @Override
    public Set<Template> getTemplates() {
        return (templates == null) ? null : new HashSet<>(templates);
    }
    @Override
    public void setTemplates(Set<Template> templates) {
        this.templates = templates.stream().map(TemplateJPA::new).collect(Collectors.toSet());
    }
}
READ ALSO
intellij idea выдает Abnormal Build process Determination [закрыт]

intellij idea выдает Abnormal Build process Determination [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

149
Почему не работает автообновление browser-sync

Почему не работает автообновление browser-sync

Почему не работает автообновление? Зацикливается обновление minCSS

82
Замыкание в js (простой пример)

Замыкание в js (простой пример)

Имеется следующий код:

95