多对多关系返回许多嵌套结果
Many to Many relationship is returning many nested results
我有两个表 [1]users 和 [2] employee_group
我正在尝试实现 ManyToMany 关系,这就是我使用注释
实现的方式
@Entity
@Table(name = "employee_group")
public class EmployeeGroup {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private long id;
@ManyToMany(mappedBy = "employeeGroups")
private List<User> users;
.........
// other properties
}
@Entity
@Table(name = "users")
public class User{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private long id;
@ManyToMany
@JoinTable(name = "emp_group_map",
joinColumns = { @JoinColumn(name = "fk_user") },
inverseJoinColumns = { @JoinColumn(name = "fk_emp_group") })
private List<EmployeeGroup> employeeGroups;
.........
// other properties
}
期望:我有一个用户(例如:userId 100)和该用户所属的两个员工组,所以我期望当我尝试获取该用户时通过 userId saay 100 它将获得带有员工组列表的用户详细信息,并且此 employeeGroups 将有两条记录。
问题: 这个 returns 嵌套结果如下:
{
"id": 11,
"employeeGroups": [
{
"id": 1,
"users": [
{
"id": 11,
"employeeGroups": [
{
"id": 1,
"users": [
{
"id": 11,
"employeeGroups": [
{
"id": 1,
"users": [
{
"id": 11,
"employeeGroups": [
{
"id": 1,
"users": [
{
"id": 11,
我卡在这里并没有弄清楚到底哪里出了问题。我正在使用 Spring-Boot 2.6.4.
Jackson 将进入 User
,看到 employeeGroup
所以它进入那个,它有一个 List<User>
所以它开始遍历那些,再次得到用户,然后是其员工组等。
这会导致潜在的 OOM。
@JsonManagedReference
@JsonBackReference
可能对你有用
此外,考虑使用 DTO,因为我假设您正在尝试 return 控制器之外的用户(因此 jackson 将映射它)。
使用 DTO Data Transfer Object
,您将从控制器 de-couple 实体和 returned DTO 并且更容易自定义和处理 returned以及它的结构。
我有两个表 [1]users 和 [2] employee_group
我正在尝试实现 ManyToMany 关系,这就是我使用注释
@Entity
@Table(name = "employee_group")
public class EmployeeGroup {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private long id;
@ManyToMany(mappedBy = "employeeGroups")
private List<User> users;
.........
// other properties
}
@Entity
@Table(name = "users")
public class User{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private long id;
@ManyToMany
@JoinTable(name = "emp_group_map",
joinColumns = { @JoinColumn(name = "fk_user") },
inverseJoinColumns = { @JoinColumn(name = "fk_emp_group") })
private List<EmployeeGroup> employeeGroups;
.........
// other properties
}
期望:我有一个用户(例如:userId 100)和该用户所属的两个员工组,所以我期望当我尝试获取该用户时通过 userId saay 100 它将获得带有员工组列表的用户详细信息,并且此 employeeGroups 将有两条记录。
问题: 这个 returns 嵌套结果如下:
{
"id": 11,
"employeeGroups": [
{
"id": 1,
"users": [
{
"id": 11,
"employeeGroups": [
{
"id": 1,
"users": [
{
"id": 11,
"employeeGroups": [
{
"id": 1,
"users": [
{
"id": 11,
"employeeGroups": [
{
"id": 1,
"users": [
{
"id": 11,
我卡在这里并没有弄清楚到底哪里出了问题。我正在使用 Spring-Boot 2.6.4.
Jackson 将进入 User
,看到 employeeGroup
所以它进入那个,它有一个 List<User>
所以它开始遍历那些,再次得到用户,然后是其员工组等。
这会导致潜在的 OOM。
@JsonManagedReference
@JsonBackReference
可能对你有用
此外,考虑使用 DTO,因为我假设您正在尝试 return 控制器之外的用户(因此 jackson 将映射它)。
使用 DTO Data Transfer Object
,您将从控制器 de-couple 实体和 returned DTO 并且更容易自定义和处理 returned以及它的结构。