【发布时间】:2021-08-25 09:38:13
【问题描述】:
我有两个实体,它们是多对多关系。
@Entity
public class Room {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@ManyToMany(mappedBy = "rooms")
private Set<Team> teams;
}
@Entity
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@ManyToMany
@JoinTable(name = "teams_rooms",
joinColumns = @JoinColumn(name= "team_id"),
inverseJoinColumns = @JoinColumn(name = "room_id"))
private Set<Room> rooms;
}
为了产生数据,我有一个“房间”和“团队”的存储库:
public interface RoomRepository extends CrudRepository<Room, Long> {
}
public interface TeamRepository extends CrudRepository<Team, Long> {
}
我的目标是请求团队的所有房间,但防止 JPA 无限循环。
@RestController
@RequestMapping("....")
public class RoomController {
@Autowired
private RoomRepository roomRepository;
@GetMapping
public Iterable<Room> getAllRoomsOfTeam() {
final long exampleId = 1; //This is just a placeholder. The id will be passed as a parameter.
final var team = teamRepository.findById(exampleId);
return ResponseEntity.ok(team);
}
}
这是结果:
{
"id": 1,
"name": "Team1",
"rooms": [
{
"id": 1,
"name": "Room 1",
"teams": [
{
"id": 1,
"name": "Team 1",
"rooms": [
{
"id": 1,
"name": "Room 1",
"teams": [
Jackson 将永远循环,直到发生异常(因为反向引用也引用了父元素,这将创建一个循环)。
我已经尝试过@JsonManagedReference 和@JsonBackReference,但它们用于多对一关系。
如何阻止杰克逊无限循环?我想尽可能少地影响其他存储库和查询。
【问题讨论】:
-
如果您没有需要获取所有使用房间的团队的用例(通过房间变量获取团队),您不需要多对多但一对多的关系。在继续对您的问题发表评论之前,您是否考虑过这种方法?
-
你也可以查看this baeldung 的文章。
-
@Aethernite 我考虑过这种方法。但是,我需要双向获取,这意味着我需要双向的多对多关系。我已经阅读了这篇文章,但它是关于与反向引用的一对多关系,我也有(但在我遵循这些步骤后它们工作正常)。
-
您可以在此链接stackoverflow.com/a/47118424/8986786找到解决方案
标签: java spring spring-boot jpa jackson