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