Каскадирование целевого объекта с другими отношениями

У меня есть множество отношений, сопоставленных с этими 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;
   ......
}

Я пытаюсь выполнить много каскадных тестов в таблице соединений ApplicatifTerminalDo из двух сущностей ApplicatifDo и TerminalDo. Когда я создаю или обновляю ApplicatifTerminalDo в наборе, каскадирование работает хорошо, но когда дело доходит до удаления или удаления orphan Это не работает

Первый:

Для удаления я получаю ошибку:

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

Я хотел бы, чтобы при удалении сущности ApplicatifDo или TerminalDo все строки, связанные с ними в таблице соединений ApplicatifTerminal, также удалялись.

Второе:

Для orphanRemoval: когда я удаляю элемент из набора ApplicatifTerminalSet в моей сущности ApplicatifDo и выполняю слияние, то для его проверки я делаю поиск по его идентификатору родительской сущности, чтобы получить новую точно такую ​​же сущность и подсчитать количество элементов в наборе я получаю хорошее число (число при бигиннинге с одним меньшим). Но в моей базе данных все еще есть все данные моего Сета.

Код:

//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() работает хорошо. У меня нет ошибки в консоли, когда я это делаю. Тогда кажется, что удаление работает, потому что я извлекаю тот же объект по его идентификатору, он по-прежнему говорит, что у меня есть 3 элемента, затем четвертый был удален: НО, когда я смотрю в phpmyadmin, мои 4 элемента / отношения в моей таблице appplicationterminal все еще там. Если я сделаю еще один TestNg позже, просто получая мой applicationatifDo по его идентификатору, на этот раз он получит четыре элемента. Тогда есть большая проблема целостности здесь, и все же я всегда использую нетерпеливую выборку. Есть идеи, почему такая проблема здесь? И как я могу сделать мои каскадные работы?

В третьих:

Более глобально, у меня есть другие правила каскадирования + orphanRemoval для двух других сущностей, и это работает очень хорошо, но цель сущности этих каскадов не имеет других отношений с другими сущностями. Ясно, что существуют определенные правила (или, возможно, ограничения) при каскадировании объектов с другими отношениями. Пожалуйста, знаете ли вы учебники / правила, объясняющие лучшие практики для таких сопоставлений?

Заранее спасибо. Я застрял на этом слишком долго.

0 ответов

Другие вопросы по тегам