Guice には、
Extension
メソッド(または
トランザクション管理を
@Transactional アノテーションが
どんな
guice-persist の
- [Google Guice で
JPA の トランザクションを 管理する - あめだま] (http://d.hatena.ne.jp/momijiame/20120209/1328798077)
動作確認用の サンプルプログラム
動作確認用に
結論は、Nestできた
です。
何故Nestできるのか
当たり前ですが、
guice/JpaLocalTxnInterceptor.java at master · google/guice内で、
Nestされている
@Transactional アノテーションの
// Allow 'joining' of transactions if there is an enclosing @Transactional method. if (em.getTransaction().isActive()) { return methodInvocation.proceed(); }
Nestされているem.getTransaction().isActive()
が
transactionに
UnitOfWork に ついて
Transactions · google/guice Wiki に
@Transactional に
こちらは
使い
は
実装は
- サンプル実装の
抜粋
@Test public void testPersistWithUnitOfWork2() { UnitOfWork unitOfwork = injector.getInstance(UnitOfWork.class); unitOfwork.begin(); MyEntityRepository repo = injector.getInstance(MyEntityRepository.class); try { repo.begin(); repo.persist("Test 3"); repo.persist("Test 4"); repo.persist("Test 5"); repo.commit(); } catch (MyEntityRepository.MyRuntimeException ignored) { } finally { unitOfwork.end(); } unitOfwork = injector.getInstance(UnitOfWork.class); unitOfwork.begin(); repo = injector.getInstance(MyEntityRepository.class); try { repo.begin(); assertEquals("Test 3", repo.findByName("Test 3").getName()); assertEquals("Test 4", repo.findByName("Test 4").getName()); assertEquals("Test 5", repo.findByName("Test 5").getName()); repo.commit(); } finally { unitOfwork.end(); } }
プログラムの 説明、 注意点
UnitOfWork#begin()の 呼び出し タイミング
UnitOfWork#begin() の
guice/JpaPersistService.java at master · google/guiceの
これは、
以下、
java.lang.IllegalStateException: Work already begun on this thread. Looks like you have called UnitOfWork.begin() twice without a balancing call to end() in between.
ですので、
※使
UnitOfWork#begin() 後は、 EntityTransaction#begin()呼び 出し > CRUD > EntityTransaction#commit()の 順に 呼び出し を 行う。
EntityTransaction#begin()、
呼び
@Transactionの
※昔ながらの
使い所に ついて
@Transaction アノテーションで、
トランザクション単位で
メソッド化が
融通を
個人的には、
以上です。
コメント