java - 如何在Java Spring和Hibernate的单个事务中管理2个DAO方法?

Posted

技术标签:

【中文标题】java - 如何在Java Spring和Hibernate的单个事务中管理2个DAO方法?【英文标题】:How to manage 2 DAO methods in a single transaction in Java Spring and Hibernate? 【发布时间】:2016-01-24 02:25:03 【问题描述】:

我正在构建一个新的动态网站,并在 Spring MVC 中创建了 2 个 DAO 类来管理 2 个不同表中的查询。 我需要知道如何使用 Hibernate 在单个事务中管理 2 个 DAO 方法...实际上,我创建了 2 个 DAO Java 类和相关的实现类:

第一个 DAO 类(FirstDAOImpl.java):

@Transactional(readOnly = false, rollbackFor=Exception.class)
public void insertUser(User user) 

    //do insert an user using hibernate...
   

第二个DAO类(SecondDAOImpl.java):

@Transactional(rollbackFor=Exception.class)
public void insertUserRole(UserRole register) 

    //do insert user role using hibernate...

在我的 Spring 控制器中,我需要在单个事务中调用两个 DAO 方法...

实际上,我对任何 DAO 方法都有一个新的事务方法:

@RequestMapping(value = "/new-user", method = RequestMethod.POST)
    public String insertNewUser(Model model) 
    
        //Other code
        try
        
            firstDAO.insertUser(myUserObject);
            secondDAO.insertUserRole(myUserRoleObject);
        
        catch(Exception e)
        
            logger.info("exception!");
        
        //Other code
    

当插入新记录的方法insertUserRole()失败时,前一个方法insertUser()的事务执行成功,不回滚!

如何在一个事务中管理这两种方法?我会把这两个操作分开...

谢谢! :)

【问题讨论】:

【参考方案1】:

您需要使用 @Transactional 从另一个方法调用 DAO 方法。

然后将在 DAO 方法之外创建事务,它们将使用现有事务(由于默认传播)而不是创建自己的新事务。

【讨论】:

谢谢!!你能用一个简单的代码解释你的帖子吗? :) 嗯,当然...@Transactional void myMethod() dao1.method(); dao2.method(); 。修改以满足您的需求,并阅读交易。它们既棘手又非常重要。 非常感谢! :) 一件事:dao1 和 dao2 方法也应该是事务性的? 这完全取决于您打算如何使用它们。这就是为什么我说read up on transactions。它们不是一件简单的事情。

以上是关于java - 如何在Java Spring和Hibernate的单个事务中管理2个DAO方法?的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何在java桌面应用程序中使用spring(事务)和hibernate创建嵌入式H2 DB?

java - 如何使用simplebroker或rabbitMQ和java spring在websocket中获取所有连接的用户

如何在spring boot中重写java.sql.Array Descriptor和java.sql.ARRAY?

如何使用Spring + EasyMock做Java单元测试

java - 如何在Java Spring和Hibernate的单个事务中管理2个DAO方法?

如何使用 gradle 6+ 和 java 11+ 在 Spring Boot 中配置 spock