0

我已经阅读了有关 jpa cascade 的信息,但仍有一个问题。

ParentBiz.java

...
@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent", fetch = FetchType.LAZY, targetEntity = ChildrenBiz.class)
private List<Child> children;
...

子.java

...
@ManyToOne(targetEntity = ParentBiz.class, fetch = FetchType.LAZY)
@JoinColumn(name = "ID_PARENT", nullable = false)
@ForeignKey(name = "FKMAW53A")
private Parent parent;
...

很简单,对吧?我已经编写了一个插入父母(及其孩子,通过级联)的测试,它工作正常。然后我在父级上添加一个子级并合并父级,它也可以正常工作。但是当我删除一个孩子并合并父母时,它不是级联的。

据我所知,每次合并父级时,它都应该删除所有子级并再次插入,但这不是正在发生的事情。我真的一无所知,因为这似乎很容易......

4

1 回答 1

1

它无法将合并请求级联到子级,因为它不在父级的子级集合中进行级联。所以提供者看不到对不在列表中的孩子所做的任何更改。因为孩子拥有关系,所以不能从父母一方改变,关系将继续存在于数据库中。

如果您希望从数据库中删除子项,则需要使用孤儿删除。这将导致从集合中删除的任何元素从数据库中删除。但是不应该有其他对孩子的引用,如果这些孩子实体打算独立于他们的父母或可以交换,这不是一个很好的措施。

另一种解决方案是在子项从父项中移除后显式合并子项。如果这是不可能的,您可以将关系更改为单向并从父级到子级。这将允许父级控制外键,以便对集合的更改会导致更改反映在数据库中。

于 2013-06-13T13:20:55.430 回答