gpt4 book ai didi

java - 如何将@JsonManagedReference 和@JsonBackReference 用于多对多关系的最佳实践?

转载 作者:行者123 更新时间:2023-12-01 23:17:36 33 4
gpt4 key购买 nike

非常感谢您解释我的问题。

我有 2 个实体和 1 个桥接表实体,

假设他们是团队、用户和团队用户。

团队实体:

    @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TEAM_ID")
private Integer id;

@JsonManagedReference
@OneToMany(mappedBy = "team", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<TeamUsers> team_users = new HashSet<>();

用户实体:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@JsonBackReference
@OneToMany(mappedBy = "user")
private Set<TeamUsers> team_users = new HashSet<>();

TeamUserEntity(桥接表):@EmbeddedId私有(private) TeamUsersId id;

@ManyToOne
@MapsId("teamId")
@JoinColumn(name = "team_id")
@JsonBackReference
private Team team;

@ManyToOne
@MapsId("userId")
@JoinColumn(name = "user_id")
@JsonManagedReference
private User user;

@Column(name = "active")
private int active;

如您所见,我使用了@JsonManagedReference 和@JsonBackReference告诉程序实体查询的方向,避免无限递归。

现在,如果我在 Team CRUDrepository 上运行 get repo.findAll(),我将获得所有 Team 对象,在内容中我将获取所有桥接表数据,其中还包括用户详细信息。

但是有时候如果我想以相反的方式查询数据,我想获取所有用户信息并且对象应该包含所有团队信息,看起来像注释 @JsonManagedReference 和 @JsonBackReference 阻止结果。

在现实世界的开发中,我们应该如何管理这里?

最佳答案

@JsonManagedReference@JsonBackReference 注释用于处理循环引用。它们可用于以双向方式创建 JSON 结构。 @JsonManagedReference 注释用于目标 POJO 的子引用,这意味着它是在序列化过程中包含的前向引用,而 @JsonBackReference注解是在序列化过程中省略的backreference,通常用在对应的子类中。

因此,这里用@JsonBackReference注解的属性,也就是TeamUsers中的Team,不会被序列化。这就是为什么当您尝试让所有在 TeamUsers 中拥有 Team 的用户时,它不会起作用。此外,如果这样做,它将违反它们用于递归访问映射的注释的目的。

如果您想以任何一种方式获取数据,您应该使用 @JsonIgnoreProperties 而不是这两个注释。如下更改您的实体类,您将获得所需的输出。

Team 类中,在 team_users 字段上设置 @JsonIgnoreProperties("team") 以忽略映射 team 再次在此字段内以避免递归映射。将您的 Team 类更改为:

public class Team {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TEAM_ID")
private Integer id;

@OneToMany(mappedBy = "team", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonIgnoreProperties("team")
private Set<TeamUsers> team_users = new HashSet<>();

}

同样,在User类中,在team_users字段上设置@JsonIgnoreProperties("user")来忽略映射user 再次在此字段内以避免递归映射。将您的 User 类更改为:

public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
@JsonIgnoreProperties("user")
private Set<TeamUsers> team_users = new HashSet<>();
}

最后,在 TeamUsers 类中,为 teamuser 设置 @JsonIgnoreProperties("team_users") code> 字段再次忽略这些字段内的映射 team_users 以避免递归映射。将您的 TeamUsers 类更改为:

public class TeamUsers {

@EmbeddedId
private TeamUserId id;

@ManyToOne
@MapsId("teamId")
@JoinColumn(name = "team_id")
@JsonIgnoreProperties("team_users")
private Team team;

@ManyToOne
@MapsId("userId")
@JoinColumn(name = "user_id")
@JsonIgnoreProperties("team_users")
private User user;

@Column(name = "active")
private int active;
}

现在您可以通过任何一种方式获取数据而无需递归映射。

关于java - 如何将@JsonManagedReference 和@JsonBackReference 用于多对多关系的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68624046/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com