0

我有一个机器表和一个应用程序表。在我的模型中,应用程序在机器上运行,因此应用程序包含机器引用。但是机器不知道自己运行了哪些应用程序。

所以我的类定义是这样的:

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 类中?

4

2 回答 2

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 的特定机器上运行的所有应用程序并删除这些应用程序。

于 2013-02-13T07:25:54.063 回答
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);
于 2013-02-13T08:50:43.907 回答