[Seasar-user:20568] Re: 複数の永続ユニット使用について

oh [E-MAIL ADDRESS DELETED]
2011年 2月 7日 (月) 02:54:59 JST


長谷川です。

データソースの設定がまずければ、そもそも繋ぐ先が違うのだから
双方を検証しても意味がないというのは理解しています。

それとは別に、DataAccessor#readDb で発行される EntityManager#flush
が、実際に DB に更新 SQL を発行しなくてもアサーションが可能なのか
というところなのですが。

再三 update が発行されるかは問題ないとおっしゃられていますので
ちょっと混乱してきました。

とりあえず、教えていただいたように DataSource 二つ別の接続先 DB の
ものを用意しました。

persistence.xml で persistence-unit にそれぞれ別の DataSource を
指定して、以下の unit-name で定義しました。

・sc01
・sc02

EntityManager sc01 -> DataSource1 -> local DB
EntityManager sc02 -> DataSource2 -> 別マシンの DB

となっています。

この状態で、sc02 を使用する Bean のテストケースを実行した場合
初期データ読み込みが DataSource1 側に行われるため、そもそも
事前データの不正になります。
#当然といえば当然ですが

これを回避するためテストケースに以下を追加しました
#ここでやるのはまずいかもしれないですが、とりあえず簡易法ということで

	@PostBindFields
	public void setupSc2() {
		DataAccessorImpl da2 = (DataAccessorImpl) da;
		da2.setEntityManager((EntityManager) container
				.getComponent("sc02EntityManager"));
		da2.setDataSource((DataSource) container
				.getComponent("jdbc2.dataSource"));
	}

この設定を行うことで、DataAccessor#readDb 中での EntityManager#flush
により、実際に update SQLが発行され、結果としてアサーションも問題
なくクリアできています。

で、EntityManager の再設定を行わずに DataSource のみの設定を行うように
変更してみます

	@PostBindFields
	public void setupSc2() {
		DataAccessorImpl da2 = (DataAccessorImpl) da;
		da2.setDataSource((DataSource) container
				.getComponent("jdbc2.dataSource"));
	}

この場合 EntityManager#flush は行われますが update SQLは発行されず
(おそらく)そのため DataAccessor#readDb は変更されていない現在の DB
を読み込み、結果としてアサーションに失敗します。

この結果をみてみると、update が発行されないことが問題であって
#いや、データソースの接続が正しいことが前提ですが

> DataAccessor が読む DB (DataSource) は何か,
> 基準はそこです.
> それが合っているなら,EJB 側で使う EntityManager が
> 異なっていても,update が発行されなくても,問題は
> ありません.

とはいえないような気がします。
といいますか、以前の設定ではそもそも DataSource が一つの状態でしたので
接続先は同じで EntityManager が異なっているという状態でした。

で、この update が発行されないことによって、実際に readDb が返すデータ
セットが変わっています。問題の一つは update を発行するかどうかのように
思えます。

それとも本来であれば update が発行されなくても DataAccessor#readDb は
EntityManager 経由で変更した値をマージして、実行後の DB イメージの
データセットを取得するはず。ということでしょうか?

#すみません、いろいろ試していたら返信が遅くなってしまいました

以上、よろしくお願いいたします。
-- 
_/_/
_/_/ mailto: [E-MAIL ADDRESS DELETED]
_/_/



Seasar-user メーリングリストの案内