Java JPA中无组合的列关系
我有一张工作台和一张申请表。在我的模型中,一个应用程序在一台机器上运行,所以该应用程序在机器上包含机器引用。但机器不知道哪些应用程序是在自己身上运行的 我的类定义如下:Java JPA中无组合的列关系,java,hibernate,jpa,one-to-many,Java,Hibernate,Jpa,One To Many,我有一张工作台和一张申请表。在我的模型中,一个应用程序在一台机器上运行,所以该应用程序在机器上包含机器引用。但机器不知道哪些应用程序是在自己身上运行的 我的类定义如下: class Application{ @ManyToOne(fetch = FetchType.EAGER,cascade={CascadeType.REFRESH}) @JoinColumn(name = "machine_id",referencedColumnName="id",nullable=tr
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
}
所以我想,如果我删除一台机器,它的所有应用程序都应该被删除
有没有不将应用程序列表添加到机器类中的可能方法?请尝试以下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();
query=entityManager.createQuery(“从应用程序o中选择o,其中o.machine.id=:machineid”);
query.setParameter(“machineid”,100);
List obs=(List)query.getResultList();
此查询将返回具有给定ID的特定计算机上运行的所有应用程序,并删除这些应用程序。除了@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
类中,并添加相应的cascade属性,但由于您明确询问了如何在不添加的情况下执行此操作,因此我建议进行批量更新
下面是级联的外观:
Machine machine = entityManager.find(machineId);
entityManager.remove(machine);
有代码样本吗?我该怎么写HQL?是否有为此指定的批注?我是否要手动执行此操作?修改后的答案请查看如果要删除计算机,您的计算机如何知道在其上运行的应用程序?从另一个关系。我认为,当应用程序启动时,JPA可能包含一个关系映射。这样,引擎将从应用程序中的注释manytone中知道与应用程序和机器存在关系。我只想在这里做一个反向关系,不需要任何额外的代码。如果我能做到,我知道有一种方法是这样的。但我原以为JPA会这样做。因为在我写的问题下的评论中,JPA可能有一个关系映射,并且该关系可以从应用程序类的定义中使用。但我不确定这是不是真的doable@Neron-事实上有一种方法,但它将涉及双向关系,您在问题中排除了这种关系。请看编辑。