Почему я могу удалить элементы двунаправленного отношения, хотя только одна сторона отношения управляется в контексте постоянства (пример I)?Когда у меня есть однонаправленные отношения, которые не работают (см. Пример II).Почему?
Сущности:
@Entity
Class User {
...
@OneToMany(mappedBy = "user")
private List<Process> processes;
@OneToOne // Unidirectional
private C c;
...
@PreRemove
private void preRemove() {
for (Process p : processes) {
p.internalSetUser(null);
}
}
...
}
@Entity
Class Process {
...
@ManyToOne
private User user;
...
@PreRemove
protected void preRemove() {
if (this.user != null) {
user.internalRemoveProcess(this);
}
}
...
}
@Entity
Class C {
}
Пример I:
// Create User u1 with Processes p1, p2
tx.start();
// Only u1 is manged in persistence context and no process
userFacade.delete(u1); // There following is called: >> em.remove(em.merge(u1)); // Works
tx.commit();
Пример II:
// Create User u and Object C c, establish their relation.
tx.start();
cFacade.remove(c); //>>MySQLIntegrityConstraintViolationException,foreign key constraint fails
ty.commit();
В первом примере я использую эти внутренние методы для установки в каждом случае другой стороны отношения, но эта другая сторона не управляется в контексте постоянства, я думаю ?!Когда я изменяю процесс пользователя и сохраняю пользователя, процесс не обновляется, если я не использую cascade.MERGE или оба загружаются в транзакции и управляются на ПК.Так почему же работает удаление?