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

oh [E-MAIL ADDRESS DELETED]
2011年 2月 7日 (月) 00:07:34 JST


長谷川です。

On Sun, 06 Feb 2011 23:30:32 +0900
Koichi Kobayashi <[E-MAIL ADDRESS DELETED]> wrote:
> 
> > 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 も二組定義してください.
>

ということで、やってみました。s2junit4.dicon に TestDataPrepareImpl を二組定義して

  <component name="tdp1" class="org.seasar.framework.unit.impl.TestDataPreparerImpl">
    <initMethod name="addTestDataXlsPath">
      <arg>context.testClassShortName + "_" + context.testMethodName + ".xls"</arg>
    </initMethod>
    <initMethod name="addTestDataXlsPath">
      <arg>context.testClassShortName + ".xls"</arg>
    </initMethod>
    <property name="dataAccessor">da1</property>
  </component>
  <component name="tdp2" class="org.seasar.framework.unit.impl.TestDataPreparerImpl">
    <initMethod name="addTestDataXlsPath">
      <arg>context.testClassShortName + "_" + context.testMethodName + ".xls"</arg>
    </initMethod>
    <initMethod name="addTestDataXlsPath">
      <arg>context.testClassShortName + ".xls"</arg>
    </initMethod>
    <property name="dataAccessor">da2</property>
  </component>

実行した結果のスタックトレースが以下です。

org.seasar.framework.beans.IllegalPropertyRuntimeException: [ESSR0059]クラス(org.seasar.framework.unit.impl.ExpectedDataReaderImpl)のプロパティ(dataAccessor)の設定に失敗しました。理由はorg.seasar.framework.container.TooManyRegistrationRuntimeException: [ESSR0045]interface org.seasar.framework.unit.DataAccessorに複数のコンポーネント(org.seasar.framework.unit.impl.DataAccessorImpl, org.seasar.framework.unit.impl.DataAccessorImpl)が登録されています
	at org.seasar.framework.container.assembler.AbstractBindingTypeDef.getValue(AbstractBindingTypeDef.java:297)
	at org.seasar.framework.container.assembler.AbstractBindingTypeDef.bindAuto(AbstractBindingTypeDef.java:217)
	at org.seasar.framework.container.assembler.BindingTypeMustDef.doBind(BindingTypeMustDef.java:55)
	at org.seasar.framework.container.assembler.AbstractBindingTypeDef.bind(AbstractBindingTypeDef.java:78)
	at org.seasar.framework.container.assembler.AccessTypePropertyDef.bind(AccessTypePropertyDef.java:50)
	at org.seasar.framework.container.assembler.AccessTypePropertyDef.bind(AccessTypePropertyDef.java:41)
	at org.seasar.framework.container.assembler.AutoPropertyAssembler.assemble(AutoPropertyAssembler.java:56)
	at org.seasar.framework.container.deployer.SingletonComponentDeployer.assemble(SingletonComponentDeployer.java:68)
	at org.seasar.framework.container.deployer.SingletonComponentDeployer.deploy(SingletonComponentDeployer.java:48)
	at org.seasar.framework.container.deployer.SingletonComponentDeployer.init(SingletonComponentDeployer.java:76)
	at org.seasar.framework.container.impl.ComponentDefImpl.init(ComponentDefImpl.java:236)
	at org.seasar.framework.container.impl.S2ContainerImpl.init(S2ContainerImpl.java:563)
	at org.seasar.framework.container.impl.ThreadSafeS2ContainerImpl.init(ThreadSafeS2ContainerImpl.java:172)
	at org.seasar.framework.unit.impl.SimpleInternalTestContext.initContainer(SimpleInternalTestContext.java:190)
	at org.seasar.framework.unit.S2TestMethodRunner.initContainer(S2TestMethodRunner.java:455)
	at org.seasar.framework.unit.S2TestMethodRunner.runMethod(S2TestMethodRunner.java:240)
	at org.seasar.framework.unit.S2TestMethodRunner.run(S2TestMethodRunner.java:166)
	at org.seasar.framework.unit.S2TestClassMethodsRunner.invokeTestMethod(S2TestClassMethodsRunner.java:227)
	at org.seasar.framework.unit.S2TestClassMethodsRunner.run(S2TestClassMethodsRunner.java:89)
	at org.seasar.framework.unit.S2TestClassRunner.run(S2TestClassRunner.java:67)
	at org.seasar.framework.unit.Seasar2.run(Seasar2.java:179)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.seasar.framework.container.TooManyRegistrationRuntimeException: [ESSR0045]interface org.seasar.framework.unit.DataAccessorに複数のコンポーネント(org.seasar.framework.unit.impl.DataAccessorImpl, org.seasar.framework.unit.impl.DataAccessorImpl)が登録されています
	at org.seasar.framework.container.impl.TooManyRegistrationComponentDefImpl.getComponent(TooManyRegistrationComponentDefImpl.java:52)
	at org.seasar.framework.container.impl.S2ContainerImpl.getComponent(S2ContainerImpl.java:129)
	at org.seasar.framework.container.assembler.AbstractBindingTypeDef.getValue(AbstractBindingTypeDef.java:295)
	... 26 more

同様のエラーのように見えますが。


> > 
> > EntityManager#flush 自体は(デバッガで確かめた限りでは)どちらの場合も
> > 呼ばれているのですが、EJB が使用している EntityManager と DataAccessor
> > が認識している EntityManager とが異なっているため flush しても DB に値が
> > 反映されていないのだと思ってます。
> 
> なんだかよく分かりませんが,

すみません、また舌足らずな説明になってしまったようです。

要するに、永続化コンテキストが異なって設定されているため、変更されたという認識を
EntityManager がしてくれていないのではといったことです。

例えば 対象の EJB 側では sc02 側の EntityManager で取得した managed な entity に
変更を加えたとします。一方 DataAccessor では最初に読み込まれた EntityManager(sc01側)
に flush を発行するといった状態になっているため、sc01 側には managed な entity が存在
せず flush しても何も更新されないといった現象だろうと思っています。

> 
> dataSource も明示的に設定しないと,
> jdbc.dicon のインクルード順で最初の
> DataSource が使われていませんか?
> 

こちらですが、DataSource は確かに2つあるのですが、テスト用の環境では
その接続先が単一の DB となっていたため問題なく動作していたようです。
こちらの設定も見直します。

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



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