弹簧启动 JPA 双向无限循环问题



我有一个Java 14项目,带有Spring Boot和Spring JPA 2.2.7.RELEASE。假设我们有 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;

我在映射、从数据库获取这些实体以及所有其他相关操作方面遇到问题。我得到一个无限循环,因为两个实体不断调用自己,比如这个游戏实体 ->玩家实体 ->游戏实体等等。

我在 DTO 上遇到的相同问题并将它们作为 JSON 返回(我得到一个"永无止境"的 json,这些对象无休止地相互包装(。我已经想出将关系的一部分标记为@JsonIgnore,但我不知道如何处理这些实体。

我希望从两侧(双向(访问,以便始终填充这些对象。是否可以不将一侧/两侧的 id 替换实际对象?我已经阅读了一些Spring JPA文档和其他相关手册,根据它们,双向关系比单向关系更好,但是在这样的问题上,怎么可能实现这一目标呢?

感谢您对此事的任何提示。如果这种模式可能的话,我将非常感谢每一个为我指明正确方向的提示。

编辑:

这实际上是 BoardEntity 和 GameEntity 的一个例子,但它的逻辑与 PlayerEntity 和 GameEntity 的逻辑相同。堆栈跟踪:

org.springframework.http.converter.HttpMessageNotWritableException: 无法写入 JSON:无限递归(StackOverflowError(;嵌 套 exception is 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"]-

等等...

使用

玩家实体:

@JsonManagedReference
@OneToOne(mappedBy = "player", cascade = CascadeType.ALL, fetch = 
FetchType.LAZY, orphanRemoval = true)
private GameEntity game;

游戏实体:

@JsonBackReference
@JoinColumn(name = "player_id")
@OneToOne(fetch = FetchType.LAZY)
private PlayerEntity player;

反之亦然。

最新更新