gpt4 book ai didi

java - session#refresh 不使用@ManyToOne 和复合键刷新根实体

转载 作者:行者123 更新时间:2023-11-30 10:11:28 28 4
gpt4 key购买 nike

我有以下实体和映射:

@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

谢谢! :)

最佳答案

有人帮助我找到了解决方案:通过删除 REFRESH 来更改 OneToMany 的级联配置,它起作用了!

之前:

@OneToMany(mappedBy = "父亲", cascade = CascadeType.ALL)

之后:

@OneToMany(mappedBy = "父亲", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})

关于java - session#refresh 不使用@ManyToOne 和复合键刷新根实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52424765/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com