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

时间:2016-06-22 06:05:47

标签: 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用新的经销商更新汽车。它会更新它们,然后删除它们。非常感谢帮助。感谢。

2 个答案:

答案 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();