область сеанса гибернации - PullRequest
0 голосов
/ 05 января 2012
@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();
}

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

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

1 Ответ

3 голосов
/ 05 января 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...