Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA服务层事务_Java_Hibernate_Jpa_Entitymanager - Fatal编程技术网

Java JPA服务层事务

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

我有使用JPA2、Hibernate的MVC分层应用程序(没有Spring或任何其他框架)

现在事务只在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()
(或者创建定制的@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的原因是什么?我曾经编写过自己的自定义事务注释,但这一点都不有趣。