我们有一个名为Category的对象树,其中每个类别都有零个或多个子类别。具体做法是:
@Entity
@Table(name = "category", schema = "customer")
public class Category extends AccountOwned implements OrdinalOwner {
@ManyToOne
@JoinColumn(name = "parent_category_id")
private Category parent;
@Column(name = "name")
private String name;
@Column(name = "ordinal")
private int ordinal;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@OrderBy("ordinal")
private List<Category> children;
... getters/setters
}
我们允许儿童类别被移动(他们的顺序被改变)并允许他们在父母之间移动。
我没有使用任何明确的保存。更新包含在Spring @Transactional中。
如果我有这样的树:
Top Category
Item 1
Child 1a
Child 1b
Item 2
Child 2a
Item 3
Child 3a
Child 3b
Child 3c
我可以将项目1中的第3项作为孩子移动并且它可以工作。树正确保存。
我可以将孩子1b作为孩子移动到第2项下,它也有效。树正确保存。
但是,如果我在树上移动任何东西,则保存不起作用。例如,如果将“孩子1b”移到“最高类别”下,则第1-3项仍然有效,但“孩子1b”将永远消失。
当我将Child 1b移到Top Category(通过将其添加到Top Category&#39; s)时,我可以看到它从第1项的孩子中删除 - 这很好。我可以正确地看到它被添加到Top Category的孩子们。我可以确认所有类别的父母在搬迁过程中都得到了正确的设置。
在我看来,JPA / Hibernate正在检测从一个集合中移除子节点并对该对象执行删除,因此当它到达另一个列表的添加时,该对象已经消失。
这看起来像Hibernate中的一个错误。谁能帮忙。如果它是JPA / Hibernate的限制,那么如何实现逻辑呢?
编辑:嗯,我可以看到其他几个人报告此问题,但没有找到任何真正的解决方案。我正在使用hibernate 5.1.1。答案 0 :(得分:0)
我必须创建一个类似于:
的工作不幸的是我不能在这里分享代码,因为框架是专有的。