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