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