簡體   English   中英

Java:如何在一個請求中處理多個Hibernate事務?

[英]Java: How to handle multiple Hibernate transactions in one request?

我不確定在哪里打開我的Transaction對象。 在服務層內? 還是控制器層?

我的Controller基本上有兩個服務,讓我們稱之為AServiceBService 然后我的代碼類似於:

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 
    }
}

我想要的行為是,如果bService#save失敗,那么我可以調用一個transaction#rollback aService以便在aService中保存的任何內容也將被回滾。 如果我為兩個保存創建一個單獨的事務,這似乎是可能的。

但從另一個角度來看,我的Controller依賴於Transaction ,看起來真的很難看。 如果我在相應的服務中創建Transaction會更好(比如Spring @Transactional的工作方式),但如果我這樣做,那么我不知道如何實現我想要發生的事情......

編輯:固定代碼,添加了另一個條件。 我沒有使用任何Spring依賴項,因此使用@Transactional是不可能的。

你可以用另一層抽象和使用組合來完成你所要求的。

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或你想要命名的任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM