[英]JPA service layer transactions
我有使用JPA 2,Hibernate(沒有Spring或任何其他框架)的MVC分層應用程序。
現在,事務只能在DAO層上實現,如下所示:
public class AccountDao {
private EntityManagerFactory emf;
public AccountDao(EntityManagerFactory emf) {
this.emf = emf;
}
public void saveAccount(Account account) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
try {
em.persist(account);
em.getTransaction().commit();
} catch (Exception ex) {
em.getTransaction().rollback();
} finally {
em.close();
}
}
}
但是我想要的是在服務層上獲取事務:
public class AccountService {
private AccountDao accountDao;
private UserDao userDao;
//needed the method to be in transaction
public void transferUserAccount(){
User user = // ...
userDao.saveUser(user);
Account account = //
accountDao.saveAccount(account);
//rest logic that has to be executed atomically
}
}
可能的解決方案之一是使用em.getTransaction().begin()
在另一個try/catch/finally
em.getTransaction().begin()
代碼包裝在transferUserAccount()
方法內(或創建自定義的@Transactional批注,在em.getTransaction().begin()
進行此操作),但我不是確定JPA如何處理嵌套事務。 同樣,這種解決方案將DAO特定的東西(如實體管理器)暴露給服務層。
無論如何,在transferUserAccount()
使用嵌套事務的解決方案是否合適?
還有其他解決方案來處理此類情況嗎? 提前致謝!
如果您不希望將事務管理泄漏到服務中,我建議進一步拆分DAO,以使DAO具有兩個DAO /存儲庫-屬性(一個用於User
,一個用於Account
),在DAO-中創建事務。方法,然后將EntityManager
向下傳遞給User
-和Account
-DAO /存儲庫。
另一種選擇是在AccountDao
中創建方法transferAccount(Account account, user from, user to)
在其中創建transaction
,執行所有邏輯,然后調用userDao.save(from, em)
, userDao.save(to, em)
並從那里save(account, em)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.