JPA中没有组合的列关系

时间:2013-02-13 07:12:38

标签: java hibernate jpa one-to-many

我有一个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类中,是否有任何可能的方法?

2 个答案:

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