gpt4 book ai didi

java - JPA服务层事务

转载 作者:太空宇宙 更新时间:2023-11-04 09:33:16 25 4
gpt4 key购买 nike

我有使用 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
}
}

可能的解决方案之一是将代码包装在另一个 try/catch/finallytransferUserAccount() 方法中,并使用 em.getTransaction().begin()(或创建自定义 @Transactional 注释来在后台执行此操作),但我不确定 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)

关于java - JPA服务层事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56825815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com