2

3つのテーブル(Patients DoctorsとMedicines)があるとします。Patientsテーブルには、Doctorsテーブルの列を参照するFK制約があり、同様に、Medicinesテーブルには、Patientsテーブルの列を参照するFK制約があります。今私が使用して患者から削除しようとすると

//Delete From Patient Table
    javax.persistence.Query query = manager.createQuery("DELETE  From PatientEnroll e WHERE e.no =:arg1");
    int val = Integer.parseInt(no);
    query.setParameter("arg1", val);
    query.executeUpdate();

次のエラーが発生します:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`acme`.`medicines`, CONSTRAINT `PatientNo` FOREIGN KEY (`PatientNo`) REFERENCES `Patients` (`PatientNo`) ON DELETE NO ACTION ON UPDATE NO ACTION)

患者テーブルから何かを削除するにはどうすればよいですか?

4

1 に答える 1

3

最初に患者を参照している薬を削除します。

delete from Medicine m 
where m.patient.id in (select p.id from PatientEnroll p where p.no = :arg1)

または、患者との関連付けを解除して削除します。

update Medicine m set patient = null 
where m.patient.id in (select p.id from PatientEnroll p where p.no = :arg1)

そうしないと、明らかに外部キーの制約を破ることになります。存在しない患者を参照する薬はデータベースに残ります。これこそが、外部キー制約が役立つ理由です。このような不整合を回避してください。

与えられた数の患者が何百人もいない限り、JPAでそれを行う通常の方法は次のことであることに注意してください。

Patient p = getPatientByNumber(args1);
em.remove(p);

アソシエーションにタイプREMOVEのカスケードがある場合、すべての薬も削除されます。そうでない場合は、次のことを行う必要があります。

Patient p = getPatientByNumber(args1);
for (Medicine m : p.getMedicines()) {
    em.remove(m);
}
em.remove(p);

また

Patient p = getPatientByNumber(args1);
for (Medicine m : p.getMedicines()) {
    m.setPatient(null);
}
em.remove(p);
于 2012-07-27T14:59:38.200 に答える