Я разрабатываю веб-сервис RESTful с spring-data в качестве уровня доступа к данным, поддерживаемым JPA/ Спящий режим. Очень часто возникают отношения между объектами домена. Например, представьте сущность Product
, которая имеет сущность Category
.
Теперь, когда клиент POST
s Product
представляет метод JAX-RS. Этот метод снабжен аннотацией @Transactional
для переноса каждой операции репозитория в транзакцию. Конечно, клиент отправляет только id
уже существующего Category
, а не полное представление, а только ссылку (внешний ключ).
В этом методе, если я сделаю это:
entity = repository.save(entity);
переменная entity
теперь имеет Category
только с набором полей id
. Это меня не удивило. Я не ожидал, что при сохранении (вставка SQL) будет получена информация о связанных объектах. Но мне нужно, чтобы весь объект Product
и связанные с ним объекты могли вернуться к пользователю.
Затем я сделал это:
entity = repository.save(entity);
entity = repository.findOne(entity.getId());
то есть получить объект после его сохранения в рамках той же транзакции/сеанса.
К моему удивлению, переменная entity
ничего не изменила. На самом деле база данных даже не получила ни одного запроса на выборку. Это связано с кешем Hibernate. По какой-то причине в той же транзакции поиск не извлекает весь граф объектов, если этот объект ранее сохранялся.
С Hibernate решение, по-видимому, заключается в использовании session.refresh(entity)
(см. внутри одного и того же">это и это) . Имеет смысл.
Но как мне добиться этого с помощью весенних данных?
Я хотел бы избежать создания повторяющихся пользовательских репозиториев. Я думаю, что эта функциональность должна быть частью самих весенних данных (некоторые люди уже сообщали об этом на форуме весенних данных: thread1, thread2).