在Hibernate中使用孤立删除

时间:2015-10-08 07:00:20

标签: java spring hibernate one-to-many all-delete-orphan

我正在Spring-Hibernate申请中工作。我的问题与orphan removal有关,如下面的代码所述。

@Entity
public class User {
    ...........
    @OneToMany(mappedBy = "user", orphanRemoval = true, cascade = CascadeType.ALL)
    List<UserRole> userRoles = new ArrayList<>();
    ..........
}

考虑save/update User方案。 一种方法是从列表中删除该子对象,如user.getUserRoles().remove(userRole) 另一种方式可能是将子列表清除为user.getUserRoles().clear(),然后将其添加到列表中,无论用户角色是否在请求中。在这种情况下,orphan removal将删除未加入请求的用户角色。

哪一个更好更正确?

2 个答案:

答案 0 :(得分:4)

这取决于您使用的语境和语义类型,请参阅Collection performance以获取有关不同语义及其性能调整的更多信息。

嗯,在这种情况下,您使用列表语义进行一对多关联,因此假设您在列表中有20个元素

选项1:您要逐个删除15个元素并在其中添加1个元素,然后hibernate将发出15个DELETE语句和一个INSERT语句。

选项2:清除整个列表并手动添加所有6个元素,这样只会发出6个INSERT语句并发出1DELETE语句。

如果对集合进行了大量修改,我将使用选项2,请参阅One shot delete以获取更多详细信息。如果列表未经过大量修改,我将选择选项1。 。
干杯:)

答案 1 :(得分:2)

除了你的集合和实例数量之外,我认为第一种方式(从列表中删除子元素)是最合适的方式,而这正是orphanRemoval的设计目标。

因为使用orphanRemoval所有您需要做的就是从关系表中删除子项,并且此子项(记录)将从其原始表中自动删除。

因为如果你看一下Orphan Removal in Relationships documentation,你会看到:

  

当从关系中删除一对一或一对多关系中的目标实体时,通常需要将删除操作级联到目标实体。此类目标实体被视为“孤儿”,orphanRemoval属性可用于指定应删除孤立实体。

所以我认为最好的方法是让Hibernate自动完成它的工作,而不是手动完成它,毕竟这是在Hibernate中使用orphanRemoval的第一个目的。