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

oh [E-MAIL ADDRESS DELETED]
2011年 2月 6日 (日) 18:46:17 JST


長谷川です。

On Sun, 06 Feb 2011 18:00:00 +0900
Koichi Kobayashi <[E-MAIL ADDRESS DELETED]> wrote:
> 
> log1.txt では
> 
> ・update 後,Hibernate による select は行われていない.
> ・トランザクションはロールバックされている.
> 
> ので,Hibernate によって自動的に update が
> 発行される条件は揃っていないように見えます.
> アプリ側で flush() しているのではありませんか?
> 

これは、log1 側で update が発行されるのがそもそもおかしいということでしょうか。
ソース上では、明示的な flush は行っておりません。

> log1.txt では update の後に
> 
> > 2011/02/06 16:13:24 DEBUG [org.seasar.extension.jdbc.impl.BasicHandler] - SELECT * FROM I1002M ORDER BY pt_cd, alt_cd
> 
> が出ていますが,自分で直接 SQL を発行する前に,
> 明示的に flush() しているのでは?

これは、おそらくテストケース側で検証に使用している DataAccessor#readDb
が発行しているのだと思います。

> そのコンポーネントが 複数の EntityManager に
> 対応しておらず,DI される EntityManager は dicon の
> インクルード順に依存している (プロパティ名と
> EntityManager の名前が一致していない) ということは
> ないでしょうか?
> 

再度確認はしてみたのですが、違いは見つかりませんでした。

ソース自体は非常に単純なものでして、例えば ejb-entity 側の EJB は


	@PersistenceContext(unitName = "sc01")
	EntityManager em;

	@Override
	public I1002m get(String ptCd, String altCd) {
		return em.find(I1002m.class, new I1002mId(ptCd, altCd));
	}
...

となっています。persistence.xml と名称は一致しています。

ejb-core 側で、この EJB を単純につかってデータ更新を行うサンプルでテスト
を行っていますが、そのソースも

	@Override
	public void doit() {
		I1002m value = dao.get("A", "B");
		value.setOpKbn("X");
	}

といったごく単純なものです。jpa のインクルード順に依存するようなコードに
なっているでしょうか。
あるいは、モジュールが分かれているということがなんらかの問題になっている
のでしょうか。

一応、実行したテストケースも以下に

	private TestContext ctx;

	private DataAccessor da;

	private Sc1Service service;

	public void doit() {
		DataSet expected = ctx.getExpected();
		service.doit();
		assertEquals(expected, da.readDb(expected));
	}


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



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