【发布时间】:2019-02-19 06:57:07
【问题描述】:
(注:已编辑添加代码以重现行为)
我有以下三个实体
@Entity
public class ClassA {
@Id private UUID id = UUIDGenerator.generate();
@OneToMany(mappedBy = "classA", cascade = {CascadeType.PERSIST, CascadeType.DETACH,CascadeType.REMOVE}, orphanRemoval = true)
List<ClassB> classBs= new ArrayList<>();
//setters and getters
}
@Entity
public class ClassB {
@Id private UUID id = UUIDGenerator.generate();
@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.REMOVE},
orphanRemoval = true, mappedBy = "classB")
private ClassC classC;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "classA_id")
private ClassA classA;
// setters and getters
@Entity
public class ClassC {
@Id private UUID id = UUIDGenerator.generate();
@OneToOne //(fetch = FetchType.LAZY)
@MapsId
private ClassB classB;
//setters and getters
}
public interface ClassARepository extends CrudRepository<ClassA, UUID> {}
//Example code to reproduce
ClassC classC_1 = new ClassC();
ClassC classC_2 = new ClassC();
ClassB classB_1 = new ClassB();
ClassB classB_2 = new ClassB();
classC_1.setClassB(classB_1);
classC_2.setClassB(classB_2);
classB_1.setClassC(classC_1);
classB_2.setClassC(classC_2);
ClassA classA = new ClassA();
classB_1.setClassA(classA);
classB_2.setClassA(classA);
classA.getClassBs().add(classB_1);
classA.getClassBs().add(classB_2);
classARepository.save(classA);
我正在使用 Spring Boot 和 CRUD 存储库。我第一次尝试保存 A 类型的实体时,我希望由于 CascadeType.PERSIST 注释,所有 A、B 和 C 类的层次结构都将被保存。然而事实并非如此,我得到了一个
org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find classB with id ...
如果我将@OneToMany 级联类型更改为CascadeType.ALL,则保存classA 和classB,但不保存classC。如果我将所有级联类型更改为 ALL,则所有内容都将保存。
但是,我想级联保存操作,仅在创建新实体时而不是在合并时,我认为这正是 PERSIST 的含义。有人可以解释上述行为以及我怎样才能实现我想要的吗?
问候
【问题讨论】:
-
为了让其他人重现,请添加示例代码,您如何创建和持久化这些实体。
-
添加代码,让你更容易复现