我不確定在哪裏打開我的Transaction
對象。在服務層內?還是控制器層?Java:如何在一個請求中處理多個Hibernate事務?
我的Controller
基本上有兩個服務,我們稱它們爲AService
和BService
。然後,我的代碼都類似:
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
將被回滾以及。這似乎是可能的,如果我爲這兩個保存創建一個單一的事務。
但從另一個角度來看,它看起來非常難看,我的Controller
依賴於Transaction
。如果我在相應的服務中創建Transaction
會更好,(如Spring @Transactional的工作原理),但如果我這樣做,那麼我不知道如何實現我想要實現的目標......
編輯:固定代碼,增加了另一個條件。我沒有使用任何Spring依賴關係,所以@Transactional的使用是不可能的。
好的 - 可能會有些偏離主題,但我沒有使用任何Spring依賴關係,所以我只是手動創建新的事務。如果我在CompositeABService.save()中打開一個事務 - 這意味着在AService.save()和BService.save()中打開另一個事務會導致錯誤。請看看我的編輯 – mpmp