Распространение транзакций Spring: невозможно получить связанные объекты @OneToMany при использовании одной и той же транзакции для операции создания и консультации.

У меня следующая проблема: я работаю над приложением с пружинной загрузкой, которое предлагает службы REST и использует реляционную (SQL) базу данных с использованием spring-data-jpa.

У меня есть две службы REST: - служба создания объектов, которая создает дочерний объект, родительский объект и связывает их в одной транзакции. Когда эта служба заканчивается, данные фиксируются в базе данных. - консультационная служба сущностей, которая возвращает родительскую сущность с ее дочерними элементами

Эти две службы помечены аннотацией @Transactional. Это производственный случай, он работает хорошо: я могу создать родительский объект с его дочерними элементами в одной транзакции (которая зафиксирована/завершена) и получить ее в другой последней транзакции.

Проблема в том, что я хочу создать интеграционные тесты. Моя идея заключалась в том, чтобы аннотировать каждый тест аннотацией @Transactional и выполнять откат после каждого теста. Таким образом, я сохраняю свою базу данных в чистоте между каждым тестом, и мне не нужно снова генерировать схему или очищать все записи в базе данных.

Интеграционный тест состоит в создании родителя и его дочерних элементов, а затем их чтении, всего в одной транзакции (поскольку тест аннотирован @Transaction). При чтении объекта, ранее созданного в той же транзакции, я могу получить родительский объект, но дочерние объекты не извлекаются (нулевое значение). Я не уверен, что хорошо понимаю механизм транзакций: я думал, что при использовании @Transactional в тестовом методе службы (с аннотацией «@Transactional»), вызываемые этим тестом, должны обнаруживать и использовать ту же транзакцию, открытую тестом. метод (распространение настроено на «ОБЯЗАТЕЛЬНЫЙ»). Следовательно, поскольку транзакция использует один и тот же EntityManager, он должен иметь возможность возвращать связь между родительским объектом и его дочерними элементами, созданными ранее в той же транзакции, даже если данные не были зафиксированы в базе данных. Странно то, что он извлекает родительский объект (который еще не был зафиксирован в базе данных), но не его дочерние элементы. Правильно ли я понимаю концепцию транзакции? Если нет, может ли кто-нибудь объяснить мне, что мне не хватает?

Кроме того, если кто-то сделал что-то подобное, может ли он объяснить мне, как он это сделал, пожалуйста?

Мой код довольно сложный. Сначала я хочу знать, хорошо ли я понимаю, как управляются транзакции, и если кто-то уже делал что-то подобное. Если это действительно необходимо, я могу отправить дополнительную информацию о моей реализации (как инициализируются диспетчер транзакций и диспетчер сущностей, сущности JPA, службы и т. д.)


person Francois Gergaud    schedule 24.05.2016    source источник


Ответы (1)


Связывая Entity-manager в моем тесте и вызывая его метод flush из моего теста, между созданием и чтением операция чтения работает хорошо: я получаю родительский объект с его дочерними элементами. Но данные записываются в базу данных во время создания, чтобы прочитать их позже во время операции чтения. И я не хочу, чтобы транзакция была зафиксирована, так как мне нужно, чтобы мой тест работал с пустой базой данных. Мое непонимание связано не столько с механизмом транзакций, сколько с менеджером сущностей: он не хранит в качестве кеша созданные сущности и их отношения...

Этот пост поможет мне. Проблема с аннотациями @Transactional в Spring JPA

В заключение я думаю о вызове сценария SQL перед каждым тестом для очистки моей базы данных.

person Francois Gergaud    schedule 24.05.2016