2012-01-05 2 views
0
@Override 
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) 
public Integer createUsers(final Collection<MyUser> myUsers) { 
    final Session session = sessionFactory.getCurrentSession(); 
    for (final MyUser myUser : myUsers) { 
     /*create auto id from db and asscoiate object with session */ 
     session.save(myUser); 
     myUser.setPassword("password"); 
    } 
    return myUsers.size(); 
} 

Новый пароль автоматически сохраняется в db becuase, объект связан с сеансом. Любые дальнейшие изменения myUser в этом методе/сеансе теперь сохраняются в базе данных , если экземпляр объекта не отсоединен/выведен из сеанса.hibernate session scope

Когда метод завершен, транзакция закрыта и сеанс выходит за пределы области действия; если я вернул объект MyUser из этого метода, любые дальнейшие изменения вне этого метода (например, временные изменения в моем контроллере) не сохраняются в базе данных (если, конечно, я не ассоциируюсь с другим сеансом и транзакцией)?

+0

В чем проблема или вопрос? Вы просите подтвердить свое объяснение? – Vlad

ответ

3

Как только этот метод выполнен, транзакция будет выполнена (или откат), и сеанс будет очищен и закрыт. Поэтому каждый пользовательский объект будет иметь пароль значения, установленный на «пароль», как вы говорите.

Однако, как только сеанс закрыт, объекты пользователя находятся в изолированном состоянии (сохраняются, но не привязаны к активному сеансу).

Если вы хотите сохранить какие-либо дальнейшие изменения, вам придется вызвать session.update (пользователь), чтобы прикрепить MyUser к новому сеансу в новой транзакции.

Однако, если этот метод транзакции вызывается из другого метода транзакции, объекты MyUser не будут отсоединены до окончания этой транзакции.