为什么我可以删除双向关系的元素,尽管关系的一侧是在持久性上下文中管理的(示例 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 {
}
示例一:
// 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();
例二:
// Create User u and Object C c, establish their relation.
tx.start();
cFacade.remove(c); //>>MySQLIntegrityConstraintViolationException,foreign key constraint fails
ty.commit();
在第一个示例中,我使用这些内部方法在每种情况下设置关系的另一端,但我认为另一端不是在持久性上下文中管理的?!当我更改用户的进程并保存用户时,该进程不会更新,除非我使用 cascade.MERGE 或者两者都加载到事务中并因此在 pc 中进行管理。那么为什么删除工作?