- - PR -
Springテスティングフレームワークで、Hibernateのセッションを切断したい
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-11-17 11:12
Springテスティングフレームワーク(AbstractTransactionalDataSourceSpringContextTests)を使用して
ビジネスロジックの単体テストを行っています。 テストデータをonSetUpBeforeTransactionで準備し、ビジネスロジックを起動しようと しているのですが、ビジネスロジックでDBを更新する際に、 Illegal attempt to associate a collection with two open sessions が発生してしまいます。 とりあえず、DAOの実装を getHibernateTemplate().saveOrUpdate(...); から getHibernateTemplate().merge(...); に変更して逃げていますが、これではトランザクションのテストができないので、 AbstractTransactionalDataSourceSpringContextTestsの中で、session.close()を マニュアルで行う方法を模索しています。 現在の実装では、org.springframework.context.ApplicationContext#getBean()経由で DBにアクセスしていますが、直接Hibernaateのsessionにアクセスする方法を ご存知の方いらっしゃいませんか? | ||||
|
投稿日時: 2006-11-20 10:52
とりあえずソースを載っけてもらえませんか?
| ||||
|
投稿日時: 2006-11-20 12:12
お返事ありがとうございます。
以下、問題部分だけ抜粋しています。 public class UITest extends AbstractTransactionalDataSourceSpringContextTests { @Override protected void onSetUpBeforeTransaction() throws Exception { //テストデータ準備 AccountUpdateBusiness accountUpdateBusiness = (AccountUpdateBusiness) applicationContext.getBean("AccountUpdateBusiness"); Account account = new Account(); accountUpdateBusiness.registerAccount(account); //super.setComplete(); } public UITest() { } public void testLogin() { RequestEx request = new RequestEx(new MockHttpServletRequest()); ResponseEx response = new ResponseEx(new MockHttpServletResponse()); request.setEvent("Login"); request.addParameter("username","hoge"); request.addParameter("password","moge"); requestContext = RequestManager.buildRequestContext(request, response); RequestManager.dispatch(requestContext); } public class AccountDaoImpl implements AccountDao { public void update(Account object) throws DataAccessException { getHibernateTemplate().saveOrUpdate(object);//NG //getHibernateTemplate().merge(object);//OK } } テストデータ準備のところで、データをあらかじめ挿入すると、そこで開始された hibernateのセッションがずっと生き残っているため、テスト対象が呼び出している DAOのセッションと合わせて2個になってしまいます。 DAOにセッションを切断するメソッドを暫定的に追加して、テストデータ挿入後 セッションを切ると、テスト対象が実行されたときにはsession already closedの 例外が発生します。 現在、テストデータ挿入部分をテスト対象内に入れて、原因を探っているところです。 いろんな事情でソースを載せにくいのが苦しいところですが、もし何かあれば、 どんな些細なことでも結構ですので、アドバイスをお願いします。 | ||||
|
投稿日時: 2006-11-20 13:33
この部分を private AccountUpdateBusiness accoutUpdateBusiness; public void setAccountUpdateBusiness(AccountUpdateBusiness accoutUpdateBusiness) { this.accoutUpdateBusiness = accoutUpdateBusiness; } @Override protected void onSetUpBeforeTransaction() throws Exception { Account account = new Account(); accountUpdateBusiness.registerAccount(account); ・・・ } という感じにしてContextを1つにすればSessionも1つになると思うのですが・・・ 見当違いだったらごめんなさい。 [ メッセージ編集済み 編集者: でるびすた 編集日時 2006-11-20 13:35 ] [ メッセージ編集済み 編集者: でるびすた 編集日時 2006-11-20 13:36 ] [ メッセージ編集済み 編集者: でるびすた 編集日時 2006-11-20 13:37 ] |
1