如何在 Kotlin 中使用 JPA ManyToMany 双向关系

Posted

技术标签:

【中文标题】如何在 Kotlin 中使用 JPA ManyToMany 双向关系【英文标题】:How to use JPA ManyToMany bidirectional relation with Kotlin 【发布时间】:2019-04-11 02:07:12 【问题描述】:

我有两个在 Spring Boot 应用程序中具有双向多对多关系的类。当我想获取我的实体时,它们开始递归循环,我得到一个 *** 异常。这是我的实现。

@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。有没有办法在有或没有数据类的情况下实现上述问题?如果有办法,请举个例子。

【问题讨论】:

Infinite Recursion with Jackson JSON and Hibernate JPA issue的可能重复 【参考方案1】:

请注意,此答案是针对具有 ManyToMany 双向关系的 Kotlin 数据类的解决方案。

@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,可以避免递归循环。

【讨论】:

以上是关于如何在 Kotlin 中使用 JPA ManyToMany 双向关系的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JPA 和休眠映射 Java/Kotlin 字符串数组和 Postgres SQL 数组

在 Kotlin 中使用 Jpa 注释从基类继承父属性

使用 kotlin 插件 jpa 构建配置失败

使用 Kotlin 进行 JPA 审计

Spring boot jpa查询无法更新字段

kotlin 的 JPA:lazy 和 @Transient 不适用于休眠