【发布时间】:2018-04-05 09:03:46
【问题描述】:
首先,这是我的实体。
播放器:
@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class,
property="id")
public class Player {
// other fields
@ManyToOne
@JoinColumn(name = "pla_fk_n_teamId")
private Team team;
// methods
}
团队:
@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class,
property="id")
public class Team {
// other fields
@OneToMany(mappedBy = "team")
private List<Player> members;
// methods
}
正如许多主题已经说明的那样,您可以使用 Jackson 以多种方式避免 WebService 中的 StackOverflowExeption。
这很酷,除了 JPA 之外,在序列化之前仍然构造一个无限递归到另一个实体的实体。这很丑陋,因为请求需要更长的时间。检查此屏幕截图:IntelliJ debugger
有办法解决吗?知道我想要不同的结果取决于端点。例子:
- 端点 /teams/{id} => Team={id..., members=[Player={id..., team=null}] }
- 端点 /members/{id} => Player={id..., team={id..., members=null}}
谢谢!
编辑:也许问题不是很清楚给出我得到的答案,所以我会尽量准确。
我知道可以使用 Jackson(@JSONIgnore、@JsonManagedReference/@JSONBackReference 等)或通过映射到 DTO 来防止无限递归。我仍然看到的问题是:以上都是查询后处理。 Spring JPA 返回的对象仍然是(例如)一个 Team,包含玩家列表、包含团队、包含玩家列表等。
我想知道是否有办法告诉 JPA 或存储库(或任何东西)不要一遍又一遍地绑定实体内的实体?
【问题讨论】:
-
我在那里看到了双重信息。如果您的团队实体中已经有成员信息,为什么需要将团队保存在玩家实体中? REST API 不需要反映您的数据库方案。
-
“为什么你需要在玩家实体中保存团队”因为我想要一个实体的完整参考。当我找回一个玩家时,我想提供关于他的所有信息。
标签: java spring-data-jpa infinite-recursion