[英]Java: How to handle multiple Hibernate transactions in one request?
我不確定在哪里打開我的Transaction
對象。 在服務層內? 還是控制器層?
我的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
以便在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.