2012-01-05 144 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(); 
} 

新的密码会自动保存到数据库因为会话配有对象。除非对象实例从会话分离/驱逐,否则对此方法/会话中myUser 的任何进一步更改现在都会持久保存到数据库休眠会话范围

当方法已经完成,事务关闭,并且会话超出范围;如果我从这个方法返回一个MyUser对象,那么这个方法以外的任何更改(例如我的控制器中的临时更改)都不会持久化到数据库(除非我与另一个会话和事务相关联)?

+0

问题或疑问是什么?你是否要确认你的解释? – Vlad 2012-01-05 10:47:27

回答

3

一旦这个方法已经执行,事务将被提交(或回滚)并且会话将被刷新并关闭。因此,如你所说,每个用户对象将把值密码设置为“密码”。

但是,一旦会话关闭,用户对象处于分离状态(持续存在但未附加到活动会话)。

如果您想保留任何进一步的更改,您必须调用session.update(用户)将MyUser附加到新事务中的新会话。

但是,如果此事务性方法是从另一个事务性方法调用的,MyUser对象将不会被分离,直到该事务结束。