簡體   English   中英

JPA服務層事務

[英]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.

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