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

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2011年 2月 7日 (月) 01:30:52 JST


小林 (koichik) です.

Date:    Mon, 07 Feb 2011 00:58:25 +0900
From:    oh <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:20566] Re: 複数の永続ユニット使用について

> なのですが、そもそも元の話が update が発行されていないということでして
> update が発行されているけど更新されていないといった話ではないのです。
> 
> この update が必要かどうかを判断しているのは DataSource ではなく EntityManager
> だという理解なのですが、そこが間違っている?
> 
> EJB では、永続化コンテキスト管理下の managed な entity が変更されていたら
> トランザクションのコミット時に update を発行するものだという認識です。
> 
> したがって、実際の Bean が変更に用いた EntityManager と DataAccessor の
> 使用する EntityManager が異なっているため、DataAccessor が flush を行っても
> 実際の Bean が変更に用いた EntityManager の flush が行われないため update
> が発行されていない。といった現象なのだと考えていたのですが

DataAccessor は,「自分が読む DataSource
(の接続先の DB) を最新にするため」に
EntityManager を flush() しているだけです.
別の DataSource に関連づけられている
EntityManager を flush() する責務はありません.

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

・ejb1 が em1 経由で ds1 を更新
・ejb2 が em2 経由で ds2 を更新
・da1 が em1 を flush() してデータを検証
・ロールバック

という流れになった場合,em2 は update を
発行しませんが,da1(ds1) の検証には何も問題は
ありません.
DataAccessor の役割はそういうものです.

em2 側を検証するなら,da2 を用意して,
em2 と同時に ds2 も設定する必要があります.
da2 が em2 を flush() するのに ds1 を検証するのは
意味がありません.
それが何度も書いていることです.
[Seasar-user:20558] あたりから見直してください.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
    <property name="twitter">"http://twitter.com/koichik"</property>
</component>



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