2015-05-15 1 views
1

У меня есть следующий метод в одном из моих услугПредотвратить ранее загруженный объект обновляется в транзакционном методе

@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 для справки.

+2

Вы можете попробовать отделить 'oldUser' от сессии. Если вы используете Hibernate - 'session.evict()', с JPA 2.0 - 'entityManager.detach()' –

ответ

0

Используйте EntityManager.detach(), чтобы отделить объект от контекста инерционности:

User oldUser = userService.findUserById(userId); 

if (oldUser.infoIsTheSame(userInfo)) { 
    return; 
} 

em.detach(oldUser); 
User updatedUser = userService.addUserInfo(userId, userInfo);  
feedService.addFeed(FeedAction.INFO_UPDATE, oldUser, updatedUser); 
Смежные вопросы