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中使用孤儿删除
的第一个目的