我有一个Machine表和一个Application表。在我的模型中,应用程序在计算机上运行,因此应用程序包含机器引用。但机器不知道哪些应用程序自行运行。
所以我的课程定义是这样的:
class Application{
@ManyToOne(fetch = FetchType.EAGER,cascade={CascadeType.REFRESH})
@JoinColumn(name = "machine_id",referencedColumnName="id",nullable=true)
Machine machine
}
class Machine{
@Id
@Column(name = "id")
int id
}
所以我想要,如果我删除一台机器,应该删除它的所有应用程序。
如果没有将应用程序列表添加到Machine类中,是否有任何可能的方法?
答案 0 :(得分:0)
尝试低于JPQL
query = entityManager.createQuery("select o from Application o where o.machine.id = :machineid");
query.setParameter("machineid", 100);
List<Application> obs = ( List<Application>)query.getResultList();
此查询将返回在具有给定ID的特定计算机上运行的所有应用程序并删除这些应用程序。
答案 1 :(得分:0)
除了@Real的答案之外,您还可以使用批量更新,首先删除应用程序,然后删除计算机:
Query removeApplications = entityManager.createQuery("DELETE FROM Application a WHERE a.machine.id = :machineid");
removeApplications.setParameter("machineid", machineIdToBeDeleted);
removeApplications.executeUpdate();
Query removeMachine = entityManager.createQuery("DELETE FROM Machine m WHERE m.id = :machineid");
removeMachine.setParameter("machineid", machineIdToBeDeleted);
removeMachine.executeUpdate();
不要反过来删除,你可能会得到一个禁令违规例外。
编辑 - 这样做的正确JPA方式是使关系双向并级联删除。为此,您需要向Machine
类添加一个应用程序列表并添加相应的级联属性,但由于您明确询问如何在不添加的情况下执行此操作,因此我提出了批量更新。
以下是级联的外观:
Machine machine = entityManager.find(machineId);
entityManager.remove(machine);