我读过有关jpa级联的内容,但仍有疑问。
ParentBiz.java
...
@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent", fetch = FetchType.LAZY, targetEntity = ChildrenBiz.class)
private List<Child> children;
...
Child.java
...
@ManyToOne(targetEntity = ParentBiz.class, fetch = FetchType.LAZY)
@JoinColumn(name = "ID_PARENT", nullable = false)
@ForeignKey(name = "FKMAW53A")
private Parent parent;
...
简单,对吧?我写了一个测试插入一个父(及其子,通过级联)的测试,它的工作正常。然后我在父节点上添加一个子节点并合并父节点,它也可以正常工作。但是当我删除一个孩子并合并父母时,它并没有级联。
据我所知,它应该删除所有子节点并在每次合并父节点时再次插入它,但这不是正在发生的事情。我真的很无能,因为它似乎很容易......
答案 0 :(得分:1)
它不能将合并请求级联到子级,因为它不在Parent的子级集合中级联到。因此,提供商无法看到对列表中没有的子项所做的任何更改。由于孩子拥有这种关系,因此无法从父母方面进行更改,并且该关系将继续存在于数据库中。
如果您希望从数据库中删除子项,则需要使用孤立删除。这将导致从集合中删除的任何元素都将从数据库中删除。但是应该没有其他提及孩子的内容,如果这些儿童实体意图独立于父母或者可以互换,则不是一个很好的措施。
另一种解决方案是在孩子从父母身边移除后明确合并孩子。如果无法做到这一点,您可能会将关系更改为单向关系,并从父级转换为子级关系。这将允许父级控制外键,以便对集合的更改导致更改反映在数据库中。