【发布时间】:2018-01-02 04:31:47
【问题描述】:
我在将持久操作级联到子级时遇到问题。
我有一个 parent 和一个 child 类。当我用 Spring-Data Repository 保存一个孩子的父母时,孩子的值都是 null 或 0。
如果我将 CascadeType.ALL 添加到 OneToMany-Annotation 我收到此错误: “正在合并同一实体的多个表示”
@Entity
@Getter
@Setter
public class TestParent {
@Id
@GeneratedValue
private Long id;
@OneToMany(mappedBy = "parent", cascade = {CascadeType.DETACH, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE}, orphanRemoval = true)
private List<TestChild> children;
}
@Entity
@Getter
@Setter
public class TestChild {
@Id
@GeneratedValue
private Long id;
private int value;
@ManyToOne
private TestParent parent;
}
这是测试保存对象是否有效的代码:
@Test
@Transactional
public void test123(){
TestParent parent = new TestParent();
parent = testRepo.save(parent);
TestChild child1 = new TestChild();
child1.setValue(3);
child1.setParent(parent);
parent.setChildren(new ArrayList<>());
parent.getChildren().add(child1);
parent = testRepo.save(parent);
assertThat(parent.getChildren().size()).isNotZero();
assertThat(parent.getChildren().get(0).getValue()).isEqualTo(3);
}
所以我的方法是在不添加 cascadeType Merge 的情况下修复级联 Persist。任何提示我做错了什么?
【问题讨论】:
-
然后不要保存父级。第二次保存是更新,因此是合并。持久化仅对新的非持久化实例有效。接下来,您将通过在添加子项之前执行
new ArrayList()来销毁托管集合。恕我直言,您的代码在多个方面存在缺陷。