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单元测试