- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
非常感谢您解释我的问题。
我有 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
类中,为 team
和 user
设置 @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/
我正在尝试找到一种根据我从关联存储库引用的实体来交换 @JsonBackRefence 和 @JsonManagedReference 的方法。 Site.java @Entity @Table(na
我有两个对象:UserEntity 和 ApartmentEntity,它们以 OneToMany 方式关联(一个用户可以拥有多个公寓)。我在使用无限递归将其序列化为 JSON 时遇到问题(我使用 @
我想知道Jackson中@JsonManagedReference和@JsonBackReference的区别? 最佳答案 @JsonManagedReference is the forward p
我正在尝试保留一个具有内部列表的对象。我必须用 @JsonManagedReference 注释实体 Item和 ItemProperty 与 @JsonBackReference,以避免无限循环 -
我正在将 Mysql 与 Java Spring Boot 应用程序和 JPA 一起使用。我在两个表(bean)之间有一对一的关系,如下所示: @JsonManagedReference @OneTo
非常感谢您解释我的问题。 我有 2 个实体和 1 个桥接表实体, 假设他们是团队、用户和团队用户。 团队实体: @Id @GeneratedValue(strategy = Gener
非常感谢您解释我的问题。 我有 2 个实体和 1 个桥接表实体, 假设他们是团队、用户和团队用户。 团队实体: @Id @GeneratedValue(strategy = Gener
回答 我将解决有关此博客的问题 Jackson – Bidirectional Relationships 谢谢你。 更新2 问题与 JsonBackReference 和 JsonManagedRe
我知道@JsonIgnore和@JsonManagedReference,@JsonBackReference都是用来解决无限递归(StackOverflowError)的 code>,这两者有什么区
我有来自用户和角色的关系,其中角色具有“一对多”关系,而用户与“role_id”列具有“多对一”关系 当我在 Spring Boot 上使用关系时,当我使用 @OneToMany 和 @ManyToO
为了避免无限递归,我使用 @JsonManagedReference 和 @JsonBackReference 。但是在检索结果时,我只能以一种方式获得预期结果。 @ManyToMany(ca
我正在使用 Spring Boot 编写 OneToMany 关系,一个属性可以有多个 propertySale。 这是我的属性类: @Data @Getter @Entity @Table(name
我读过了 http://vard-lokkur.blogspot.com/2010/10/json-jackson-to-rescue.html http://vard-lokkur.blogspot
我是一名优秀的程序员,十分优秀!