我想删除与另一个实体有@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用新的经销商更新汽车。它会更新它们,然后删除它们。非常感谢帮助。感谢。
答案 0 :(得分:1)
首先将外键设置为可空:
public class Car implements Serializable {
@ManyToOne
@JoinColumn(name="co_id" , nullable = true)
private Dealership dealership;
}
然后你得到经销商的IdToRemove:
int id = dealershipToRemove.getId();
然后您删除所有具有给定ID
经销商的汽车query = session.createNativeQuery("delete from cars where co_id = :id and date is null");
query.setParameter(1,id);
query.executeUpdate();
然后你打破了dealerhipToRemove和它的汽车之间的关系:
dealershipToRemove .setCars(null);
session.remove(dealershipToRemove);
答案 1 :(得分:1)
只需刷新()经销商对象,然后再将其删除,以反映与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();