Java JPA服务层事务
我有使用JPA2、Hibernate的MVC分层应用程序(没有Spring或任何其他框架) 现在事务只在DAO层上实现,如下所示:Java JPA服务层事务,java,hibernate,jpa,entitymanager,Java,Hibernate,Jpa,Entitymanager,我有使用JPA2、Hibernate的MVC分层应用程序(没有Spring或任何其他框架) 现在事务只在DAO层上实现,如下所示: public class AccountDao { private EntityManagerFactory emf; public AccountDao(EntityManagerFactory emf) { this.emf = emf; } public void saveAccount(Account ac
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()
(或者创建定制的@Transactional注释,在后台完成),但我不确定JPA如何处理嵌套事务。
这种解决方案还公开了特定于DAO的东西,如实体管理器
进入服务层
无论如何,在transferUserAccount()中嵌套事务的解决方案是否合适
有没有其他解决办法来处理这种情况?
提前谢谢 如果您不想将事务管理泄漏到您的服务中,我建议进一步拆分DAO,使DAO具有两个DAO/存储库属性(一个用于用户
,一个用于帐户
),在DAO方法中创建事务,并将EntityManager
向下传递给用户
-和帐户
-DAO/存储库
另一个选项是在AccountDao
中创建一个方法transferAccount(Account Account,user from,user to)
,在那里创建事务
,执行所有逻辑,然后调用userDao.save(from,em)
userDao.save(to,em)
和save(Account,em)
。如果您不想将事务管理泄漏到您的服务中,我建议进一步拆分DAO,使DAO具有两个DAO/存储库属性(一个用于用户
,一个用于帐户
),在DAO方法中创建事务,并将EntityManager
向下传递给用户
-和帐户
-DAO/存储库
另一个选项是在
AccountDao
中创建一个方法transferAccount(Account Account,user from,user to)
,在那里创建事务
,执行所有逻辑,然后调用userDao.save(from,em)
userDao.save(to,em)和save(Account,em)
从这里开始。我假设用户和帐户之间存在一对一的相关性,对吗?如果这是真的,您可以在account对象内的user属性中添加一个appropiate级联类型,以便在保存/更新account时保存/更新相应的用户。@Turing85是的,您是对的,但是还有一些事情应该以原子方式执行。问题是如何在没有Spring的情况下使用普通jpa在服务层实现事务性如果您不想将事务管理泄漏到您的服务中,我建议进一步拆分DAO,使DAO具有两个DAO/存储库属性(一个用于用户
,一个用于帐户
),在DAO方法中创建事务,并将其传递给用户
-和帐户
-DAO/存储库。@Turing85您的意思是将EntityManager
显式传递给所有应该在一个事务中完成的DAO方法吗?不使用spring framework的原因是什么?我曾经写过我自己的自定义事务注释,但这一点都不好玩。我会假设用户和帐户之间存在一对一的关联,对吗?如果这是真的,您可以在account对象内的user属性中添加一个appropiate级联类型,以便在保存/更新account时保存/更新相应的用户。@Turing85是的,您是对的,但是还有一些事情应该以原子方式执行。问题是如何在没有Spring的情况下使用普通jpa在服务层实现事务性如果您不想将事务管理泄漏到您的服务中,我建议进一步拆分DAO,使DAO具有两个DAO/存储库属性(一个用于用户
,一个用于帐户
),在DAO方法中创建事务,并将其传递给用户
-和帐户
-DAO/存储库。@Turing85您的意思是将EntityManager
显式传递给所有应该在一个事务中完成的DAO方法吗?不使用spring framework的原因是什么?我曾经编写过自己的自定义事务注释,但这一点都不有趣。