【发布时间】:2020-05-16 17:22:22
【问题描述】:
我有一个使用 Spring Boot 和 Spring JPA 2.2.7.RELEASE 的 Java 14 项目。假设我们有 2 个实体:
玩家实体:
@OneToOne(mappedBy = "player", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
private GameEntity game;
游戏实体:
@JoinColumn(name = "player_id")
@OneToOne(fetch = FetchType.LAZY)
private PlayerEntity player;
我在映射、从数据库中获取这些实体以及所有其他相关操作时遇到问题。我得到一个无限循环,因为这两个实体不断调用自己,比如这个 GameEntity -> PlayerEntity -> GameEntity 等等。
我在使用 DTO 并将它们作为 JSON 返回时遇到了同样的问题(我得到了一个“永无止境的”json,这些对象无休止地相互包裹)。我想将关系的一部分标记为@JsonIgnore,但我不知道如何处理这些实体。
我想从双方(双向)访问,以便始终填充这些对象。是否可以不用在一侧/两侧用 id 替换实际对象?我已经阅读了一些 Spring JPA 文档和其他相关手册,根据它们,双向关系比单向关系更好,但是如何在遇到此类问题时实现这一点?
感谢您对此事的任何提示。如果这种模式是可能的,我将非常感谢每一个为我指明正确方向的提示。
编辑:
这实际上是 BoardEntity 和 GameEntity 的示例,但它与 PlayerEntity 和 GameEntity 的逻辑相同。堆栈跟踪:
org.springframework.http.converter.HttpMessageNotWritableException: 无法写入 JSON:无限递归(StackOverflowError);嵌套的 例外是 com.fasterxml.jackson.databind.JsonMappingException: 无限递归(StackOverflowError)(通过引用链: pl.nombritech.squareconomy.model.entity.GameEntity["board"]-pl.nombritech.squareconomy.model.entity.BoardEntity["game"]-pl.nombritech.squareconomy.model.entity.GameEntity["board"] -pl.nombritech.squareconomy.model.entity.BoardEntity["game"]-pl.nombritech.squareconomy.model.entity.GameEntity["board"]-pl.nombritech.squareconomy.model.entity.BoardEntity["game" ]-pl.nombritech.squareconomy.model.entity.GameEntity["board"]-
等等……
【问题讨论】:
-
在 DTO 中使用 @JsonIgnore 后,实体仍然会发生递归?
-
你读过The best way to map a @OneToOne relationship with JPA and Hibernate吗?那里有一些工作示例,您可以将其用作入门。
-
@Bloodlex 请提供您遇到的异常的完整堆栈跟踪。
-
谢谢,我已经包含了一个堆栈跟踪
标签: java spring hibernate spring-boot jpa