我有一个与这 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;
......
}
我尝试从两个实体 AppplicatifDo 和 TerminalDo 对连接表 AppplicatifTerminalDo 进行许多级联测试。当我在 Set 中创建或更新 AppplicatifTerminalDo 时,级联效果很好,但是当涉及 orphanRemoval 或 delete 时它不起作用
第一的 :
对于删除,我收到错误:
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)
.....
我希望当我删除实体 ApplicifDo 或 TerminalDo 时,ApplicifTerminal 连接表中与它们相关的所有行也会被删除。
第二 :
对于 orphanRemoval,当我从 ApplicifDo 实体中的 ApplicifTerminalSet 集中删除一个元素并执行合并时,为了测试它,我通过他的父实体 ID 进行查找以获取一个新的完全相同的实体并计算元素的数量在 Set 中我得到了很好的数字(在 biginning 的数字少了一个)。但是在我的数据库中,我仍然拥有我的所有数据集。
编码 :
//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() 的更新效果很好。当我这样做时,我在控制台中没有错误。然后删除似乎起作用了,因为我通过他的 ID 检索到相同的对象,它仍然说我有 3 个元素,然后第四个已被删除:但是,当我查看 phpmyadmin 时,我的 appplicationterminal 表中的 4 个元素/关系仍然存在。 如果我稍后再做一次 TestNg,这次只需通过他的 ID 检索我的 appplicatifDo,它就会得到四个元素。然后这里有一个很大的完整性问题,我仍然总是使用热切的获取。知道为什么会出现这样的问题吗?我怎样才能使我的级联作品?
第三 :
在全球范围内,我对其他两个实体有另一个级联 + orphanRemoval 规则,效果很好,但是这些级联的实体目标与其他实体没有其他关系。显然,在具有其他关系的实体上级联时有特定的规则(或者可能是限制)。请问您知道解释此类映射最佳实践的教程/规则吗?
提前致谢。我坚持这个太久了。