首页 > 解决方案 > Spring Data JPA Hibernate 获取@OneToOne 返回双向实体的无限循环

问题描述

我正在使用和双向Employee保存记录。在调试我的测试用例时,我发现这个循环。 EmployeeIdCard @OneToOnefetch = LazyEmployeeRepository.findById()EmployeeIdCard.employee在此处输入图像描述

虽然返回时不是这种情况,EmployeeService但我想了解这里到底发生了什么。如果我理解正确,这将无限循环。这是正常的吗?什么可能导致这种情况发生以及如何解决这个问题?以下是实体(为简单起见,删除了其他字段)。

// Employee.java
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "Employee")
@Table(
  name = "employee",
  uniqueConstraints = {
    @UniqueConstraint(name = "employee_email_unique", columnNames = "email")
  }
)
public class Employee {

  @Id
  @Column(name = "id", updatable = false, nullable = false)
  private UUID id;

  @Column(name = "first_name", nullable = false, columnDefinition = "TEXT")
  private String firstName;

  @OneToOne(
    mappedBy = "employee",
    orphanRemoval = true,
    cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE},
    fetch = FetchType.LAZY
  )
  @ToString.Exclude
  @LazyToOne(NO_PROXY)
  private EmployeeIdCard employeeIdCard;

}
// EmployeeIdCard.java
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "EmployeeIdCard")
@Table(
  name = "employee_id_card",
  uniqueConstraints = {
    @UniqueConstraint(name = "employee_id_card_number_unique", columnNames = "card_number")
  }
)
public class EmployeeIdCard {

  @Id
  @SequenceGenerator(
    name = "idcard_sequence",
    sequenceName = "idcard_sequence",
    allocationSize = 1
  )
  @GeneratedValue(strategy = SEQUENCE, generator = "idcard_sequence")
  @Column(name = "id", updatable = false, nullable = false)
  private Long id;

  @Column(name = "card_number", nullable = false, length = 8)
  private String cardNumber;

  @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  @JoinColumn(
    name = "employee_id",
    referencedColumnName = "id",
    foreignKey = @ForeignKey(name = "employee_id_card_employee_id_fk")
  )
  @ToString.Exclude
  @LazyToOne(NO_PROXY)
  private Employee employee;

}

编辑1:获取父实体(id)时,不保存

编辑 2: 在保存/获取调用之前设置父子时的相同行为。 在此处输入图像描述

标签: hibernatespring-data-jpa

解决方案


只需在具有 Employee 属性的EmployeeIdCard实体上添加此 @JsonIgnore注释(保持其他注释与以前一样)

作为:

class EmployeeIdCard {
  .
  .

@JsonIgnore
private Employee employee;

}

推荐阅读