StackOverFlow при получении набора в отношении ManyToMany - PullRequest
0 голосов
/ 06 апреля 2019

Я получаю StackOverFlowException при получении набора сущностей в ManyToMany отношениях.

Исключение выдается в слое отображения с использованием ModelMapper (использование @JsonIgnore не решило проблему). Тем не менее, при отладке я могу видеть переполнение стека в поле коллекции.

Вот мой код:

@Getter
@Setter
@Entity
@Table(name = "a_child")
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class AChildEntity extends AbstractEntity{

    @Column(nullable = false, length = 255)
    private String name;

    @Column(length = 1024)
    private String description;

    @Column(nullable = false)
    private BigDecimal value;

    @ManyToMany(mappedBy = "a_child")
    private final Set<AnocherChildEntity> menu = new HashSet<>();

}
@Data
@Entity
@Table(name = "another_child")
@SuperBuilder
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class AnotherChildEntity extends AbstractEntity{

    @Column(length = 255)
    private String name;

    @ManyToMany(cascade = {
        CascadeType.PERSIST,
        CascadeType.MERGE
    })
    @JoinTable(name = "another_child_a_child",
        joinColumns = @JoinColumn(name = "another_child_id"),
        inverseJoinColumns = @JoinColumn(name = "a_child_id")
    )
    private final Set<AChildEntity> aChild = new HashSet<>();

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "other_id")
    private OtherEntity other;
}

В моем PersistenSet я получаю: Exception occurred: com.sun.jdi.InvocationException occurred invoking method.. и отображение сбоев с несколькими похожими сообщениями в журнале консоли:

at java.util.AbstractCollection.addAll(AbstractCollection.java:344) ~[na:1.8.0_181]
    at org.hibernate.collection.internal.PersistentSet.endRead(PersistentSet.java:355) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:236) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:223) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:196) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.plan.exec.process.internal.CollectionReferenceInitializerImpl.endLoading(CollectionReferenceInitializerImpl.java:154) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishLoadingCollections(AbstractRowReader.java:249) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishUp(AbstractRowReader.java:212) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Как предложил @JBNizet, я удалил @EqualsAndHashCode в обеих сущностях, и циклическая ссылка пропала.

0 голосов
/ 06 апреля 2019

У вас есть циклическая проблема с ссылками: набор ссылок AChildEntity из AnocherChildEntity и набор ссылок AnocherChildEntity из AChildEntity.Поэтому при маршалинге создается бесконечная рекурсия, которая приводит к StackOverFlowError.

Пользователь @JsonIgnore с одной стороны, или лучше использовать отдельные классы DTO без циклических ссылок в качестве объектов интерфейса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...