Transaction
オブジェクトを開く場所がわかりません。サービス層の中に?またはコントローラレイヤー?Java:1回のリクエストで複数のHibernateトランザクションを処理する方法は?
私のController
は、基本的に2つのサービスを持っています。AService
とBService
とします。私が欲しい行動がbService#save
が失敗した場合、その後、私はtransaction#rollback
はそうaService
に保存されたものは何でもそれは同様にロールバックされるだろう呼び出すことができることである
public class Controller {
public AService aService = new AService();
public BService bService = new BService();
public void doSomething(SomeData data) {
//Transaction transaction = HibernateUtil.getSession().openTransaction();
if (data.getSomeCondition()) {
aService.save(data.getSomeVar1());
bService.save(data.getSomeVar2());
}
else {
bService.save(data.getSomeVar2());
}
//transaction.commit(); or optional try-catch with rollback
}
}
:そして、私のコードは次のようになります。これは、両方の保存用に1つのトランザクションを作成する場合にのみ可能です。
しかし、別の見方で見ると、私のController
がTransaction
に依存しているのは本当に醜いようです。それぞれのサービスの中にTransaction
を作成すると良いでしょう(私はSpring @ Transactionalの仕組みのようなものですが)私がそのようにすれば、私は何をしたいかを達成する方法がわかりません...
EDIT:固定コードで、別の条件が追加されました。私はSpringの依存関係を使用していないので、@ Transactionalの使い方は疑問です。
私はちょっと話題にはならないかもしれませんが、私はSpringの依存関係を使用していないので、私は手動で新しいトランザクションを作成しています。 CompositeABService.save()でトランザクションを開くと、これはAService.save()とBService.save()内で別のトランザクションを開くとエラーが発生することを意味します。私の編集を見てください – mpmp