我想删除一个与另一个实体具有 @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/