Каскадирование целевого объекта с другими отношениями
У меня есть множество отношений, сопоставленных с этими 3 сущностями:
@Entity
public class ApplicatifDo {
.....
@OneToMany(cascade = CascadeType.ALL, mappedBy = "applicatifDo", fetch = FetchType.EAGER, orphanRemoval = true)
private Set<ApplicatifTerminalDo> applicatifTerminalSet;
.....
}
@Entity
public class ApplicatifTerminalDo {
......
@ManyToOne
@JoinColumn(name = "idApplicatif", nullable = false)
private ApplicatifDo applicatifDo;
@ManyToOne
@JoinColumn(name = "idTerminal", nullable = false)
private TerminalDo terminalDo;
@Column
private String remarques;
......
}
@Entity
public class TerminalDo {
......
@OneToMany(cascade = CascadeType.ALL, mappedBy = "terminalDo", fetch = FetchType.EAGER, orphanRemoval = true)
private Set<ApplicatifTerminalDo> applicatifTerminalSet;
......
}
Я пытаюсь выполнить много каскадных тестов в таблице соединений ApplicatifTerminalDo из двух сущностей ApplicatifDo и TerminalDo. Когда я создаю или обновляю ApplicatifTerminalDo в наборе, каскадирование работает хорошо, но когда дело доходит до удаления или удаления orphan Это не работает
Первый:
Для удаления я получаю ошибку:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`softtwo`.`applicatifterminal`, CONSTRAINT `FK_295tcnx7wjuvv5se1g3vldxxn` FOREIGN KEY (`idApplicatif`) REFERENCES `applicatif` (`id`))
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
at com.mysql.jdbc.Util.getInstance(Util.java:384)
.....
Я хотел бы, чтобы при удалении сущности ApplicatifDo или TerminalDo все строки, связанные с ними в таблице соединений ApplicatifTerminal, также удалялись.
Второе:
Для orphanRemoval: когда я удаляю элемент из набора ApplicatifTerminalSet в моей сущности ApplicatifDo и выполняю слияние, то для его проверки я делаю поиск по его идентификатору родительской сущности, чтобы получить новую точно такую же сущность и подсчитать количество элементов в наборе я получаю хорошее число (число при бигиннинге с одним меньшим). Но в моей базе данных все еще есть все данные моего Сета.
Код:
//My applicatifDo1 has 4 elements in the ApplicatifTerminalSet here
Assert.assertEquals(applicatifDo1.getApplicatifTerminalSet().size(), 4);
Iterator<ApplicatifTerminalDo> iterator = applicatifDo1
.getApplicatifTerminalSet().iterator();
boolean first = true;
while (iterator.hasNext()) {
ApplicatifTerminalDo element = iterator.next();
if (!first) {
element.setRemarques("remarques updated");
} else {
iterator.remove();
first = false;
}
}
// updateApplicatifDo do just a merge
applicatifDao.updateApplicatifDo(applicatifDo1.getId(), applicatifDo1);
ApplicatifDo applicatifDo = applicatifDao
.findApplicatifDo(applicatifDo1.getId());
Assert.assertEquals(applicatifDo.getApplicatifTerminalSet().size(), 3);
Когда я делаю это, обновление setRemarques() работает хорошо. У меня нет ошибки в консоли, когда я это делаю. Тогда кажется, что удаление работает, потому что я извлекаю тот же объект по его идентификатору, он по-прежнему говорит, что у меня есть 3 элемента, затем четвертый был удален: НО, когда я смотрю в phpmyadmin, мои 4 элемента / отношения в моей таблице appplicationterminal все еще там. Если я сделаю еще один TestNg позже, просто получая мой applicationatifDo по его идентификатору, на этот раз он получит четыре элемента. Тогда есть большая проблема целостности здесь, и все же я всегда использую нетерпеливую выборку. Есть идеи, почему такая проблема здесь? И как я могу сделать мои каскадные работы?
В третьих:
Более глобально, у меня есть другие правила каскадирования + orphanRemoval для двух других сущностей, и это работает очень хорошо, но цель сущности этих каскадов не имеет других отношений с другими сущностями. Ясно, что существуют определенные правила (или, возможно, ограничения) при каскадировании объектов с другими отношениями. Пожалуйста, знаете ли вы учебники / правила, объясняющие лучшие практики для таких сопоставлений?
Заранее спасибо. Я застрял на этом слишком долго.