我正在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
将删除未加入请求的用户角色。
哪一个更好更正确?
答案 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
的第一个目的。