Можно ли зафиксировать часть последовательности @Transactional?

У меня есть приложение Spring Boot и есть веб-сервис, где пользователь может разместить модель экземпляра CollegeCourse, которая включает ссылки между этим классом и студентами, которые его принимают. (Данные используются для хранения строк в таблице связей, так как эти классы имеют отношение «многие ко многим».) Это работает хорошо.

Скажем, регистрация в курсе меняется. Пользователь ожидает отправки той же структуры JSON на веб-сервис, обрабатывающий вызов PUT. Код выбрал простой путь для обновления, сначала найдя и удалив все существующие ссылки CollegeCourse-Student, затем сохранив новые ссылки. (Вместо того, чтобы повторять два списка, сопоставляя элементы.) Эта часть работала также как Дана.

Затем мы добавили ограничение уникальности в таблицу Ассоциации CollegeCourse-Student, чтобы в этой таблице не мог быть один студент, связанный с одним CollegeCourse несколько раз. Это разбилось и сгорело. Во время отладочной сессии был обнаружен виновник: удаление записей CollegeCourse-Student фактически не удаляло их из базы данных до завершения транзакции. Таким образом, когда мы попытались добавить новые ссылки обратно, любые остатки от исходного сообщения противоречили тому, что уже было в базе данных.

Службе, обрабатывающей PUT, предшествует аннотация @Transactional. Я попытался переместить код, чтобы найти и удалить ассоциации в отдельном методе, и попытался и @Transactional (propagation=распространение.REQUIRED) и REQUIRES_NEW, но ни один из них не предотвратил сбой ограничения уникальности. Я также добавил @EnableTransactionManagement в мой класс приложения-та же история. Есть ли простое решение моей дилеммы?

1 ответ

  1. Не зная точно, как выглядит ваш репозиторий, вы пытались выполнить ручную очистку на entity manager После удаления?

    Что-то вроде

    entityManager.flush();
    

    Или, если вы используете хранилище JPA данных Spring, вы должны быть в состоянии определить метод flush в этом интерфейсе и вызвать его.