2012-01-05 147 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對象將不會被分離,直到該事務結束。