1

我有一个与这 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 规则,效果很好,但是这些级联的实体目标与其他实体没有其他关系。显然,在具有其他关系的实体上级联时有特定的规则(或者可能是限制)。请问您知道解释此类映射最佳实践的教程/规则吗?

提前致谢。我坚持这个太久了。

4

0 回答 0