Jpa 在具有其他关系的目标实体上层叠

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; ..

我有一个与这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;
   ......
}
我希望在删除实体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);