Spring boot JPA双向无限循环问题

问题描述 投票:1回答:1

我有一个使用Spring Boot和Spring JPA 2.2.7.RELEASE的Java 14项目。假设我们有2个实体:

PlayerEntity:

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

GameEntity:

@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的逻辑相同。 Stacktrace:

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”]-

依此类推...

java spring hibernate spring-boot jpa
1个回答
1
投票

使用

PlayerEntity:

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

GameEntity:

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

反之亦然。

© www.soinside.com 2019 - 2024. All rights reserved.