[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 メーリングリストの案内