В моем приложении Java EE у меня есть два постоянных объекта Worklist и Task со следующими отношениями JPA:
Worklist сущность:
public class WorkList implements Serializable {
...
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.REMOVE} , mappedBy ="worklist")
private List<Task> tasks;
...
}
И объект Task:
public class Task implements Serializable {
...
@ManyToOne
private WorkList worklist;
...
}
Я указал тип каскада в Worklist как:
cascade={CascadeType.PERSIST, CascadeType.REMOVE}
Итак, я могу сохранить Worklist и список tasks, которые связаны с этим Worklist, но у меня возникает проблема, когда я пытаюсь удалить Worklist, и у меня есть это исключение:
Avertissement: Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):
org.eclipse.persistence.exceptions.DatabaseException
Internal Exception:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot
delete or update a parent row: a foreign key constraint fails (`scopedata`.`TASKS`,
CONSTRAINT `FK_TASKS_WORKLIST_id` FOREIGN KEY (`WORKLIST_id`) REFERENCES `WORKLISTS`
(`id`))
Error Code: 1451
Call: DELETE FROM WORKLISTS WHERE ((id = ?) AND (version = ?))
bind => [2 parameters bound]
Query: DeleteObjectQuery(WokList{id=bbf05bdb-1314-4b07-9f4e-69898b800c00, creation=Thu
Nov 28 08:39:21 CET 2013, startDate=Thu Nov 07 00:00:00 CET 2013, endDate=Fri Nov 15
00:00:00 CET
С другой стороны, я могу успешно удалить файл Task.
Это метод в WorklistManager.java, который удаляет рабочий список.
@Override
public boolean deleteWorkList(WorkList workList) {
if (findWorkList(workList)) {
em.remove(em.merge(workList));
return true;
}
return false;
}
Затем я вызываю этот метод в управляемом компоненте:
public String deleteWorkList() {
workListManagerLocal.deleteWorkList(selectedWorkList);
return "index";
}
Я работаю с: JPA2 и Glassfish 3.1.2.2.