Jpa 在具有其他关系的目标实体上层叠
我有一个与这3个实体映射的多个关系:Jpa 在具有其他关系的目标实体上层叠,jpa,cascade,orphan,Jpa,Cascade,Orphan,我有一个与这3个实体映射的多个关系: @Entity public class ApplicatifDo { ..... @OneToMany(cascade = CascadeType.ALL, mappedBy = "applicatifDo", fetch = FetchType.EAGER, orphanRemoval = true) private Set<ApplicatifTerminalDo> applicatifTerminalSet; ..
@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;
......
}
我希望在删除实体ApplicationFDO或TerminalDo时,ApplicationFinal联接表中与其相关的所有行也会被删除
第二:
对于孤立删除,当我从我的ApplicationFDO实体中的ApplicationAfterMinalSet集合中删除一个元素并进行合并时,为了测试它,我通过父实体的Id进行查找,以获得一个新的完全相同的实体,并计算集合中的元素数,我得到的是正确的数,即二开始时的数字,少一个。但在我的数据库中,我仍然保留着我集合中的所有数据
守则:
//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中查看时,我的AppApplicationTerminal表中的4个元素/关系仍然存在。
如果我以后再做一次测试,只需通过他的Id检索我的ApplicationFDO,这次它就得到了四个元素。
然后这里有一个很大的完整性问题,而且我总是急切地使用抓取。你知道为什么会出现这样的问题吗?我怎样才能使我的级联工作
第三:
更全面地说,我在其他两个实体上有另一个级联+删除规则,这非常有效,但是这些级联的实体目标与其他实体没有其他关系。
显然,当级联到具有其他关系的实体上时,存在特定的规则或限制。
您是否知道解释此类映射最佳实践的教程/规则
提前谢谢。我被困在这上面太久了
//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);