Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Hibernate中使用孤立删除_Java_Spring_Hibernate_One To Many_All Delete Orphan - Fatal编程技术网

Java 在Hibernate中使用孤立删除

Java 在Hibernate中使用孤立删除,java,spring,hibernate,one-to-many,all-delete-orphan,Java,Spring,Hibernate,One To Many,All Delete Orphan,我在Spring Hibernate应用程序中工作。我的问题与孤立删除相关,如下代码所述 @Entity public class User { ........... @OneToMany(mappedBy = "user", orphanRemoval = true, cascade = CascadeType.ALL) List<UserRole> userRoles = new ArrayList<>(); .......... }

我在
Spring Hibernate
应用程序中工作。我的问题与
孤立删除相关,如下代码所述

@Entity
public class User {
    ...........
    @OneToMany(mappedBy = "user", orphanRemoval = true, cascade = CascadeType.ALL)
    List<UserRole> userRoles = new ArrayList<>();
    ..........
}
@实体
公共类用户{
...........
@OneToMany(mappedBy=“user”,orphanRemoving=true,cascade=CascadeType.ALL)
List userRoles=new ArrayList();
..........
}
考虑到
保存/更新用户
场景。 一种方法是从列表中删除该子对象,如
user.getUserRoles().remove(userRole)

另一种方法可能类似于将子列表清除为
user.getUserRoles().clear()
,然后将请求中的任何用户角色添加到列表中。在这种情况下,
孤立删除将删除请求中未出现的用户角色


哪一个更好、更正确?

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

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

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

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


如果集合被大量修改,我将选择选项2。有关更多详细信息,请参见。如果列表没有被大量修改,我将选择选项1。

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

因为使用
删除操作
只需从关系表中删除子项,该子项(记录)将自动从其原始表中删除

因为如果你看一下你会发现:

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

因此,我认为最好的方法是让Hibernate自动完成它的工作,而不是手动完成,毕竟这是在Hibernate中使用
孤儿删除
的第一个目的