我读过关于jpa cascade的文章,但仍然有一个问题。
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;
...很简单,对吧?我已经编写了一个测试来插入父级(以及它的子级,通过级联),它工作得很好。然后我在parent上添加一个子代并合并父代,它也工作得很好。但是当我删除子对象并合并父对象时,它不是级联的。
据我所知,每次我合并父级时,它应该删除所有子级并再次插入它,但这并不是正在发生的事情。我真的一无所知,因为这看起来很简单...
发布于 2013-06-13 21:20:55
它无法将合并请求级联到子级,因为它不在要级联到的父级的子级集合中。因此,提供者看不到列表中没有的子项所做的任何更改。由于子代拥有该关系,因此不能从父代更改,并且该关系将继续存在于数据库中。
如果要从数据库中删除子项,则需要使用孤立删除。这将导致从集合中删除的任何元素都将从数据库中删除。但是不应该有其他对子实体的引用,如果这些子实体意味着独立于它们的父母或可以交换,这不是一个很好的措施。
另一种解决方案是,一旦子代从父代中删除,就显式地合并子元素。如果这是不可能的,您可以将关系更改为单向关系,并从父级转到子级。这将允许父级控制外键,以便对集合所做的更改会在数据库中反映出来。
https://stackoverflow.com/questions/17087862
复制相似问题