0

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 
}

そのため、1 台のマシンを削除すると、そのマシンのすべてのアプリケーションが削除されるようにしたいと考えています。

アプリケーション リストを Machine クラスに追加しない方法はありますか?

4

2 に答える 2

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 に答える