[Seasar-user:20562] Re: 複数の永続ユニット使用について
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2011年 2月 6日 (日) 23:30:32 JST
小林 (koichik) です.
Date: Sun, 06 Feb 2011 22:37:51 +0900
From: oh <[E-MAIL ADDRESS DELETED]>
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:20559] Re: 複数の永続ユニット使用について
> org.seasar.framework.beans.IllegalPropertyRuntimeException: [ESSR0059]クラス(org.seasar.framework.unit.impl.TestDataPreparerImpl)のプロパティ(dataAccessor)の設定に失敗しました。理由はorg.seasar.framework.container.TooManyRegistrationRuntimeException:
ということなので,
<component class="org.seasar.framework.unit.impl.TestDataPreparerImpl">
にも
<property name="dataAccessor">da1</property>
を追加してください.
必要なら TestDataPreparerImpl も二組定義してください.
> flush 自体をしたいわけではなく、assertEquals で DB に格納されている
> データを検証したいのです。
>
> EntityManager#flush 自体は(デバッガで確かめた限りでは)どちらの場合も
> 呼ばれているのですが、EJB が使用している EntityManager と DataAccessor
> が認識している EntityManager とが異なっているため flush しても DB に値が
> 反映されていないのだと思ってます。
なんだかよく分かりませんが,
dataAccessor1 -+-> dataSource1
+-> entityManager1 ---> dataSource1
dataAccessor2 -+-> dataSource2
+-> entityManager2 ---> dataSource2
となっているとします.
ここで,dataAccessor1 (dataSoource1) を
検証するために必要なのは entityManager1 の
flush() です.しかし,
> @PostBindFields
> public void setup() {
> DataAccessorImpl da2 = (DataAccessorImpl) da;
> da2.setEntityManager((EntityManager) container
> .getComponent("sc02EntityManager"));
> }
これが行っているのは,dataAccessor1 が
使う DataSource は dataSource1 のまま,flush()
する EntityManager だけ entityManager2 に
変えています.
dataAccessor1 -+-> dataSource1
+-> entityManager2 ---> dataSource2
dataSource1 から読み込むデータの検証のため
ではなく,entityManager2 の側を flush() したい
だけなら,entityManager#flush() を使ってください
というのが前のメールで書いたことです.
entityManager2 の方を flush() しても,
dataAccessor1 が dataSource1 から読み込む内容には
影響がないからです.
ちなみに,
> s2junit4.dicon にて
>
> <component name="da1" class="org.seasar.framework.unit.impl.DataAccessorImpl">
> <property name="entityManager">sc01EntityManager</property>
> </component>
> <component name="da2" class="org.seasar.framework.unit.impl.DataAccessorImpl">
> <property name="entityManager">sc02EntityManager</property>
> </component>
dataSource も明示的に設定しないと,
jdbc.dicon のインクルード順で最初の
DataSource が使われていませんか?
--
<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 メーリングリストの案内