2016-07-27 19 views
1

Transactionオブジェクトを開く場所がわかりません。サービス層の中に?またはコントローラレイヤー?Java:1回のリクエストで複数のHibernateトランザクションを処理する方法は?

私のControllerは、基本的に2つのサービスを持っています。AServiceBServiceとします。私が欲しい行動が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つのトランザクションを作成する場合にのみ可能です。

しかし、別の見方で見ると、私のControllerTransactionに依存しているのは本当に醜いようです。それぞれのサービスの中にTransactionを作成すると良いでしょう(私はSpring @ Transactionalの仕組みのようなものですが)私がそのようにすれば、私は何をしたいかを達成する方法がわかりません...

EDIT:固定コードで、別の条件が追加されました。私はSpringの依存関係を使用していないので、@ Transactionalの使い方は疑問です。

答えて

3

あなたは、別の抽象化レイヤーとコンポジションを使用して、求めていることを達成できます。あなたは、単一の作業単位(例えば、トランザクション)の一部として、複数のリポジトリとやり取りする必要がある場合

public class CompositeABService { 
    @Autowired 
    private AService aservice; 
    @Autowired 
    private BService bservice; 

    @Transactional 
    public void save(Object value1, Object value2) { 
    aservice.save(value1); 
    bservice.save(value2); 
    } 
} 

public class AService { 
    @Transactional 
    public void save(Object value) { 
    // joins an existing transaction if one exists, creates a new one otherwise. 
    } 
} 

public class BService { 
    @Transactional 
    public void save(Object value) { 
    // joins an existing transaction if one exists, creates a new one otherwise. 
    } 
} 

これと同じパターンが一般的に使用されています。

あなたのコントローラはすべて、CompositeABServiceまたはそれに名前を付けることを望んでいる必要があります。

+0

私はちょっと話題にはならないかもしれませんが、私はSpringの依存関係を使用していないので、私は手動で新しいトランザクションを作成しています。 CompositeABService.save()でトランザクションを開くと、これはAService.save()とBService.save()内で別のトランザクションを開くとエラーが発生することを意味します。私の編集を見てください – mpmp

関連する問題