2

我正在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

哪一个更好更正确?

4

2 回答 2

4

好吧,这取决于您使用的情况和语义类型;有关不同语义及其性能调整的更多信息,请参阅集合性能。

好吧,在这种情况下,您将列表语义用于一对多关联,因此假设您在列表中有 20 个元素:

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

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

如果集合被大量修改,我将使用选项 2,请参阅One shot delete了解更多详细信息,如果列表未进行大量修改,我将选择选项 1。

于 2015-10-08T09:47:03.380 回答
2

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

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

因为如果您查看关系文档中的孤儿移除,您会看到:

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

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

于 2015-10-08T10:12:25.300 回答