Как использовать JPA ManyToMany двунаправленную связь с Kotlin - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть два класса, которые имеют двунаправленные отношения ManyToMany в приложении Spring Boot. Когда я хочу получить свои объекты, они начинают рекурсивно зацикливаться, и я получаю исключение stackoverflow. Это моя реализация.

@Entity
@Table(name = "route")
data class Route(

        @Column(name = "uid")
        @Type(type = "pg-uuid")
        @Id
        var uid: UUID,
        var image: String,
        @Column(name = "rate_id")
        var rate_id: UUID,
        @ManyToMany(cascade = [CascadeType.ALL], fetch = FetchType.LAZY)
        @JoinTable(name = "ach",
                joinColumns = [JoinColumn(name = "route_id", referencedColumnName = "uid")],
                inverseJoinColumns = [JoinColumn(name = "athlete_id", referencedColumnName = "uid")])
        var athletes: List<Athlete> = mutableListOf())

@Entity
@Table(name = "athlete")
data class Athlete(

        @Column(name = "uid")
        @Type(type = "pg-uuid")
        @Id
        var uid: UUID,
        var email: String,
        var image: String,
        @ManyToMany(mappedBy = "athletes")
        var routes: List<Route> = mutableListOf())

Я понимаю, что проблема в том, что оба моих атрибута списка находятся в конструкторе. Однако я хотел бы иметь список атрибутов в ответе. Я видел решения, в которых метод toString был перезаписан для создания строки json. Я бы предпочел вернуть объект вместо jsonString. Есть ли способ реализовать вышеуказанную проблему с или без классов данных? Пожалуйста, приведите пример, если есть способ.

1 Ответ

0 голосов
/ 07 ноября 2018

Обратите внимание, что этот ответ является решением для классов данных Kotlin с двунаправленным отношением ManyToMany.

@ManyToMany(cascade = [CascadeType.ALL], fetch = FetchType.LAZY)
@JoinTable(name = "ach",
           joinColumns = [JoinColumn(name = "route_id", referencedColumnName = "uid")],
           inverseJoinColumns = [JoinColumn(name = "athlete_id", referencedColumnName = "uid")])
@JsonIgnoreProperties("routes")
var athletes: List<Athlete> = mutableListOf())


@ManyToMany(mappedBy = "athletes")
@JsonIgnoreProperties("athletes")
var routes: List<Route> = mutableListOf())

Добавив @JsonIgnoreProperties, вы можете избежать рекурсивного цикла.

...