jpa级联添加_JPA中的级联类型

本文探讨了JPA中@OneToMany和@ManyToOne关系中的CascadeType.MERGE级联类型。通过示例展示了在更新实体时,如何在没有明确指定cascade = {CascadeType.MERGE}的情况下影响关联实体的合并。文章讨论了MERGE级联在一对多关系中的行为,并提出了在哪些场景下可能需要或避免使用这个级联选项。
摘要由CSDN通过智能技术生成

给定两个实体 Department 和 Employee 形成从 Department 到 Employee 的一对多关系 .

由于这种关系非常直观,我忽略了实体类 .

在 Department :

@OneToMany(mappedBy = "department", fetch = FetchType.LAZY)

private List employeeList = new ArrayList(0);

在 Employee :

@ManyToOne(fetch = FetchType.LAZY)

private Department department;

请注意,我没有提到 cascade = {CascadeType.MERGE} 虽然以下关系在两侧合并(拥有和反面) .

Employee employee = entityManager.find(Employee.class, 18L);

employee.setEmployeeName("zz");

Department department = employee.getDepartment();

employee.setDepartment(department);

department.setDepartmentName("e");

department.setLocation("e");

entityManager.merge(employee);

合并 Employee 时, Department 也合并 .

相反,在以下情况中,

Department department = entityManager.find(Department.class, 1L);

List employeeList = department.getEmployeeList();

for(Employee e:employeeList) {

if(e.getEmployeeId().equals(27L)) {

e.setEmployeeName("xxx");

}

}

// No further EntityManager operation(s) here.

设置为 Employee 实例的新值将直接合并到关联的基础数据库中 .

CascadeType.MERGE:合并实体状态时,还合并此字段中保存的实体 .

MERGE - 如果合并拥有实体,则合并将级联到关联的目标 .

MERGE - 级联EntityManager.merge()操作 . 如果在父项上调用merge(),则子项也将合并 . 这通常应该用于依赖关系 . 请注意,这只会影响合并的级联,关系引用本身将始终合并 . 如果使用瞬态变量来限制序列化,则可能是一个主要问题,在这种情况下,您可能需要手动合并或重置瞬态关系 . 一些JPA提供程序提供其他合并操作 .

关于上面的测试用例,我不能准确理解何时需要或者有用 cascade = {CascadeType.MERGE} . 在这种情况下 cascade = {CascadeType.MERGE} 有什么用?

这些测试用例如何在不使用 cascade = {CascadeType.MERGE} 的情况下分别合并 Department 和 Employee ?

我目前在EclipseLink 2.6.0上 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值