hibernate - Spring Data JPA Hibernate 获取@OneToOne 返回双向实体的无限循环
问题描述
我正在使用和双向Employee
保存记录。在调试我的测试用例时,我发现这个循环。
EmployeeIdCard
@OneToOne
fetch = Lazy
EmployeeRepository.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)时,不保存
解决方案
只需在具有 Employee 属性的EmployeeIdCard实体上添加此 @JsonIgnore注释(保持其他注释与以前一样)
作为:
class EmployeeIdCard {
.
.
@JsonIgnore
private Employee employee;
}
推荐阅读
- json - 如何将结构作为参数传递给函数
- javascript - 使用 Vue 路由器导航时防止刷新索引页面
- firebase - FirebaseError:分析:Firebase 配置中的“measurementId”字段为空
- mysql - 如何将以下 SQL 查询转换为 Laravel 查询?
- python-3.x - Python 3.8:使用 del 后类对象数据仍然存在
- javascript - 为什么 console.log 显示错误属性?
- flutter - Flutter:如何运行一个后台任务来监听数据队列?
- django - 如何将 TimeField 模型与当前时间进行比较?
- jenkins - 詹金斯从 cli 创建工作
- javascript - html2canvas 的问题