- PR -

Springテスティングフレームワークで、Hibernateのセッションを切断したい

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/11/17
投稿数: 2
投稿日時: 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にアクセスする方法を
ご存知の方いらっしゃいませんか?



でるびすた
常連さん
会議室デビュー日: 2005/06/15
投稿数: 22
投稿日時: 2006-11-20 10:52
とりあえずソースを載っけてもらえませんか?
未記入
会議室デビュー日: 2006/11/17
投稿数: 2
投稿日時: 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の
例外が発生します。

現在、テストデータ挿入部分をテスト対象内に入れて、原因を探っているところです。
いろんな事情でソースを載せにくいのが苦しいところですが、もし何かあれば、
どんな些細なことでも結構ですので、アドバイスをお願いします。
でるびすた
常連さん
会議室デビュー日: 2005/06/15
投稿数: 22
投稿日時: 2006-11-20 13:33
引用:

@Override
protected void onSetUpBeforeTransaction() throws Exception {

//テストデータ準備
AccountUpdateBusiness accountUpdateBusiness
= (AccountUpdateBusiness) applicationContext.getBean("AccountUpdateBusiness");
・・・
}


この部分を

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

スキルアップ/キャリアアップ(JOB@IT)