java - 如何在删除实体之前刷新关系

标签 java hibernate

我想删除一个与另一个实体具有 @OneToMany 关系的实体,设置如下:

public class Dealership implements Serializable {

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "dealership", orphanRemoval = true)
    private Set<Car> cars;
}

public class Car implements Serializable {

    @ManyToOne
    @JoinColumn(name="co_id") 
    private Dealership dealership;

}

问题是,当我删除经销商时,我只想删除未售出的汽车。无论我尝试什么,Hibernate 都会通过级联删除与经销商相关的所有汽车。这就是我一直在尝试的。在此示例中,我尝试将已售出的汽车转移到另一个经销店,然后删除该经销店。这应该删除经销商、其员工以及仅未售出的汽车:

Session session = SessionManager.getSession();
Transaction tx = session.beginTransaction();

Dealership dealershipToDelete = (Dealership) session.load(Dealership.class, idDealership);

for(Car c: dealershipToDelete.getCars().stream().filter(c -> c.isSold()).toArray(Car[]::new)){
    Dealership newDealership = (Dealership) session.load(Dealership.class, idNewDealership);
    c.setDealership(newDealership);
    dealershipToDelete.getCars().remove(c);
}

session.update(dealershipToDelete);

session.flush();

session.delete(dealershipToDelete);

tx.commit();

session.close();

但它总是删除所有汽车。即使我设法让 Hibernate 更新新经销商的汽车。它更新它们,然后删除它们。帮助将不胜感激。谢谢。

最佳答案

只需在删除 Dealership 对象之前刷新()它即可反射(reflect)对其与 Car 类的关系所做的更改。稍微修改了您的代码,请尝试以下操作:

Dealership dealershipToDelete = (Dealership) session.load(Dealership.class, idDealership);
Dealership newDealership = (Dealership) session.load(Dealership.class, idNewDealership);
for(Car c: dealershipToDelete.getCars().stream().filter(c -> c.isSold()).toArray(Car[]::new)){   
    c.setDealership(newDealership);
    newDealership.getCars().add(c);
}
session.flush(); //this will flush the updates to sold Car, with the new Dealership details 
session.refresh(dealershipToDelete); //this will load the updated "dealershipToDelete" without the 'Sold Car' object,the 'Unsold' ones will still be there
session.delete(dealershipToDelete); //this will delete the Dealership and its related unsold car objects.

tx.commit();

session.close();

关于java - 如何在删除实体之前刷新关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37959803/

相关文章:

javax.persistence.OneToMany.orphanRemoval<>Z

java - 如何在 Hibernate 中配置 StatementInspector?

java - 如何在 Hibernate 中建立零对多关系

java - Hibernate 带有 @Transactional 的延迟初始化异常

java - Hibernate:维护实体的先前版本

java - 特殊字符未保存在数据库中

java - 如何为从 Eclipse 运行的程序指定默认 JVM 参数?

java - Spring代理是否请求属性?

java - 是否有用于 Eclipse 3.4 的 jface 数据绑定(bind)框架的良好示例和文档?

什么在java中存放密码更倾向于char[]而不是String