java - session#refresh 不使用@ManyToOne 和复合键刷新根实体
问题描述
我有以下实体和映射:
@Entity
public class Father {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@OneToMany(mappedBy = "father", cascade = CascadeType.ALL)
private Set<Child> childs = new HashSet<>();
// getters and setters
}
和
@Entity
@IdClass(Child.ChildPk.class)
public class Child {
@Id
@JoinColumn(name = "father_id")
@ManyToOne(optional = false)
private Father father;
@Id
@Column(name = "name")
private String name;
public Child() {
}
// getters and setters
static class ChildPk implements Serializable {
private Father father;
private String name;
// getters and setters
// equals and hashcode on both father and name
}
}
如您所见,我的Child
类在其所有成员上都有一个复合键,包括其@OneToMany
指向Father
.
我遇到的问题如下:当我尝试刷新一个Father
实体(session.refresh(father)
)时,它没有正确刷新:子被重新加载,并且子里面的父亲也是,但不是根父亲。
我试图在简化的上下文中重现(使用 H2 和 JPA 的简单 Spring Boot 项目,现在由于实体加载的无限循环而出现 StackOverflow 错误)。
我的映射有问题吗?
这是重现错误的 github 项目:https ://github.com/bpagnier/test-jpa
谢谢 !:)
解决方案
有人帮我找到了解决方案:通过删除 OneToMany 的 Cascade 配置来改变REFRESH
它的工作原理!
前 :
@OneToMany(mappedBy = "father", cascade = CascadeType.ALL)
后 :
@OneToMany(mappedBy = "father", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})
推荐阅读
- python - 调用 API 调用时 tkinter 中的对话框冻结
- javascript - 无法将 Mongoose 连接到 Mongodb 连接 ECONNREFUSED ::1:27017
- c - C中结构的不完整类型定义的无效使用
- linux - Linux bash:如何根据另一行/不同行上的模式替换一行上的字符串?
- postgresql - 未找到 PostgreSQL ODBC 连接 VB .NET 数据源名称且未指定默认驱动程序
- python - 在熊猫中,如何将给定列的不同值转置到行的不同列
- c - 输出未包含所有字符
- android - 引起:android.content.res.Resources$NotFoundException:实现BottomNavigationView时资源ID #0x0
- mobile - Bootstrap 4 - 导航栏切换不起作用。它没有显示任何导航链接
- three.js - RingGeometry 在三个.js 中旋转