У меня есть следующий метод в одном из моих услугПредотвратить ранее загруженный объект обновляется в транзакционном методе
@Override
@Transactional
public void createUserInfo(long userId, UserInfo userInfo) {
User oldUser = userService.findUserById(userId);
if (oldUser.infoIsTheSame(userInfo)) {
return;
}
User updatedUser = userService.addUserInfo(userId, userInfo);
feedService.addFeed(FeedAction.INFO_UPDATE, oldUser, updatedUser);
}
Как вы можете видеть findUserById()
и addUserInfo()
методы в той же службе, которая отмечена как сама @Transactional
.
Как userService.findUserById()
выполняет в той же транзакции, что createUserInfo()
начал, экземпляр oldUser
также зависит от изменения информации о пользователе внутри addUserInfo()
(как загруженный управляемый объект находится в той же транзакции).
Так что моя проблема в том, что при попытке addFeed()
oldUser
и updatedUser
совпадают после вызова метода обслуживания.
Так что мой вопрос в том, есть ли способ изменить так, чтобы oldUser
не повлиял?
Обратите внимание, что изменение addUserInfo()
, чтобы начать новую транзакцию, не является вариантом для меня, так как используется в нескольких других местах.
Я попытался также скопировать oldUser
(например, через BeanUtils), но проблема остается.
Thnx для справки.
Вы можете попробовать отделить 'oldUser' от сессии. Если вы используете Hibernate - 'session.evict()', с JPA 2.0 - 'entityManager.detach()' –