Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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_Hibernate - Fatal编程技术网

Java Hibernate中的孤立删除(当有多个映射对象时)

Java Hibernate中的孤立删除(当有多个映射对象时),java,hibernate,Java,Hibernate,我有这个项目的结构: class UserServiceSettingsImpl { ... @ManyToOne private UserImpl user; @ManyToOne private ServiceImpl service; ... } class ServiceImpl { .... @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "

我有这个项目的结构:

class UserServiceSettingsImpl {
...

    @ManyToOne
    private UserImpl user;

    @ManyToOne
    private ServiceImpl service;
...

}

class ServiceImpl {
....
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "service", orphanRemoval = true)
    private Set<UserServiceSettingsImpl> userServiceSettings;
....

}

class UserImpl {
....
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "user", orphanRemoval = true)
    private Set<UserServiceSettingsImpl> serviceSettings;
....
}
类用户服务设置简单{
...
@许多酮
私有用户impl用户;
@许多酮
私人服务impl服务;
...
}
类ServiceImpl{
....
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy=“service”,orphan=true)
私有设置用户服务设置;
....
}
类UserImpl{
....
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy=“user”,orphan=true)
专用设置服务设置;
....
}

我试图删除服务和所有属于它的内容(userservicestettingsiml),但不小心,这些设置没有被删除(我想是因为它们不是孤立的,因为UserImpl也有它们)。所以问题是:有没有一种方法可以删除设置,而不必手动从用户中删除它们(可能有很多用户有很多设置,重复使用可能需要很多时间)

你是对的,你不能以任何自动方式删除它们-它们永远不会是孤儿。我认为你能做的最好的事情就是给自己写一个helper方法。e、 g.如果您有一个ServiceDao类,您只需添加一个助手,如下所示:

public void deleteServiceAndSettings(Service service) {
    for (UserServiceSettings setting : service.getUserServiceSettings()) {
        session.delete(setting);
    }
    session.delete(service);
}

如果用户也引用了UserServiceSettings,那么在删除服务时为什么不删除它们,您是正确的。它们不是孤立的,必须根据您的业务逻辑明确删除

三个想法:

  • 使用ORM批量删除实体。
    它与迭代没有太大区别,但是在仍然使用ORM的情况下可能会得到优化。
    
    List SettingScope=new ArrayList(service.getSettings());
    service.getSettings().clear();
    myDao.deleteAll(设置透视);
    

  • 使用直接HSQL/SQL批量删除。
    这取决于您正在使用的框架,但通常是这样的,可能在您的存储库/dao类中:

    从用户服务中删除设置Simple o where o.service.id=?


    但是,hibernate在删除时不支持联接,afaik,因此这不能按编写的方式工作。通常有必要修改HSQL以使用“delete where id IN(…)”类型的格式

  • 在ORM框架之外的数据库DDL中设置
    CASCADE DELETE
    s和
    CASCADE UPDATE
    s。(不推荐。)

  • 但是,如果有可能通过多个线程同时修改服务和用户的UserServiceSettings(即使有正确的事务边界),或者删除后在orm上下文中使用这些实体而不重新加载,则最后两个选项会出现问题。在这种情况下,您可能会在最后两种方法中遇到意外和零星的错误,并且应该通过ORM迭代设置和删除,即使这样做效率很低


    即使使用第一种方法,在删除共享实体时,在高度并发的环境中避免错误也是很困难的。

    什么是myDao?这是用于设置的DAO吗?deleteAll是一个简单的remove()每个对象吗?myDao可以是任何对象,但通常是用于处理UserServiceSettings上的数据操作的dao。这取决于您所使用的框架,以及deleteAll可能是什么样子。如果使用直接Hibernate,那么是的,我认为deleteAll实现必须是每个对象的直接迭代,根据@Hedley的回答,使用delete调用。如果使用Spring,则会出现
    getHibernateTemplate().deleteAll(列表)