Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA中无组合的列关系_Java_Hibernate_Jpa_One To Many - Fatal编程技术网

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-事实上有一种方法,但它将涉及双向关系,您在问题中排除了这种关系。请看编辑。