[Seasar-user:20559] Re: 複数の永続ユニット使用について
oh
[E-MAIL ADDRESS DELETED]
2011年 2月 6日 (日) 22:37:51 JST
長谷川です。
On Sun, 06 Feb 2011 22:00:00 +0900
Koichi Kobayashi <[E-MAIL ADDRESS DELETED]> wrote:
>
> 惜しい.
> なぜそこでスタックトレースを付けられないのかと.
>
すみません。申し訳ないです。
というわけで、再度
s2junit4.dicon で以下のように DataAccessor を2つ定義してためしてみました。
<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>
この状態で、テストケース側に Binding アノテーションを付加して
@RunWith(Seasar2.class)
public class Sc1ServiceTest {
@Binding("da1")
private DataAccessor da;
といった形で実行した場合、以下のように例外となっています。
#eclipse 上からテスト実行した結果です
org.seasar.framework.beans.IllegalPropertyRuntimeException: [ESSR0059]クラス(org.seasar.framework.unit.impl.TestDataPreparerImpl)のプロパティ(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
テストケース自体はコンポーネントではないため、Binding による指定が効いて
ないのでしょうか。
>
> DataAccessor には,それがアクセスする
> DataSource と同じ DataSource にアクセスする
> EntityManager を設定してください.
>
> DataAccessor の EntityManager を変更しても,
> それがアクセスする DataSource が変わるわけでは
> ありません.
>
> DataAccessor は,それがアクセスする から
> 正しくデータを読み込むために,同じ DataSource を
> 使う EntityManager を事前に flush() するだけです.
>
> 単に flush() がしたいなら,EntityManager#flush() を
> 呼び出してください.
>
flush 自体をしたいわけではなく、assertEquals で DB に格納されている
データを検証したいのです。
EntityManager#flush 自体は(デバッガで確かめた限りでは)どちらの場合も
呼ばれているのですが、EJB が使用している EntityManager と DataAccessor
が認識している EntityManager とが異なっているため flush しても DB に値が
反映されていないのだと思ってます。
結果として、アサーションが失敗すると
ですので、前述のように DataAccessor の EntityManager を EJB が
使用している EntityManager に明示的に入れ替えることで期待通りの
結果がでてるのかなと。
以上、よろしくお願いいたします。
--
_/_/
_/_/ mailto: [E-MAIL ADDRESS DELETED]
_/_/
Seasar-user メーリングリストの案内