JPA / Hibernate无法保存移动的孩子

时间:2018-04-20 03:30:02

标签: java hibernate jpa spring-data-jpa

我们有一个名为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。

1 个答案:

答案 0 :(得分:0)

我必须创建一个类似于:

的工作
  1. 删除orphanRemoval = true
  2. 因为我们使用中央框架来管理RESTful集合到JPA集合的转换,所以我在该框架中添加了一些内容来跟踪在树中重新定位的子项以及跟踪删除。如果发现一个孩子要搬迁,那就不管它了。任何真正删除的子节点,它使用CategoryRepository.delete()方法显式删除它们。
  3. 不幸的是我不能在这里分享代码,因为框架是专有的。