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

オブジェクトはセッションによってasscoiatedされるので、新しいパスワードはdbに自動的に保存されます。このメソッド/セッション内のmyUser のそれ以上の変更は、オブジェクトインスタンスがセッションから切り離されていない限り、データベースに保持されます。休止状態のセッションスコープ

このメソッドが完了すると、トランザクションは閉じられ、セッションは有効範囲外になります。このメソッドからMyUserオブジェクトを返すと、このメソッド以外の変更(コントローラの一時的な変更など)はデータベースに永続化されません(もちろん別のセッションやトランザクションに関連付ける場合を除きます)。

+0

問題または質問は何ですか?あなたの説明を確認するように頼んでいますか? – Vlad

答えて

3

このメソッドが実行されると、トランザクションはコミット(またはロールバック)され、セッションはフラッシュされ閉じられます。したがって、各Userオブジェクトは、あなたが言うようにpasswordという値を 'password'に設定します。

ただし、セッションが終了すると、Userオブジェクトはデタッチ状態(永続化されていますが、アクティブなセッションには接続されていません)になります。

さらに変更を永続化したい場合は、新しいトランザクション内の新しいセッションにMyUserを添付するためにsession.update(user)を呼び出す必要があります。

ただし、このTransactionalメソッドが別のTransactionalメソッドから呼び出された場合、MyUserオブジェクトはそのトランザクションが終了するまでデタッチされません。