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的情况下可能会得到优化。
List SettingScope=new ArrayList(service.getSettings());
service.getSettings().clear();
myDao.deleteAll(设置透视);
这取决于您正在使用的框架,但通常是这样的,可能在您的存储库/dao类中:
从用户服务中删除设置Simple o where o.service.id=?
但是,hibernate在删除时不支持联接,afaik,因此这不能按编写的方式工作。通常有必要修改HSQL以使用“delete where id IN(…)”类型的格式
CASCADE DELETE
s和CASCADE UPDATE
s。(不推荐。)即使使用第一种方法,在删除共享实体时,在高度并发的环境中避免错误也是很困难的。什么是myDao?这是用于设置的DAO吗?deleteAll是一个简单的remove()每个对象吗?myDao可以是任何对象,但通常是用于处理UserServiceSettings上的数据操作的dao。这取决于您所使用的框架,以及deleteAll可能是什么样子。如果使用直接Hibernate,那么是的,我认为deleteAll实现必须是每个对象的直接迭代,根据@Hedley的回答,使用delete调用。如果使用Spring,则会出现
getHibernateTemplate().deleteAll(列表)
。