休眠回滚在服务层不起作用
hibernate rollback not working in service layer
我在回滚 insert/update postgresql 数据库中的数据时遇到问题,在服务层,而在 DAO 层它工作正常。
我的 DAO junit 测试代码
@ContextConfiguration("classpath:datasource-context-test.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public class SellerDAOTest {
@Test
@Rollback(true)
public void testAddSeller() {
try {
SellerDO sellerDO = getSellerDO();
sellerDAOImpl.addSeller(sellerDO);
} catch (DataException cdExp) {
Assert.fail();
}
}
}
我的 dao impl 看起来像
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void addSeller(SellerDO sellerDO) throws DataException {
try {
Session session = this.getSessionFactory().getCurrentSession();
session.save(sellerDO);
} catch (HibernateException hExp) {
throw new DataException("DB Error while adding new seller details", hExp);
}
}
及以上测试回滚执行测试后插入的数据。但我的问题出在我的服务层。这里没有回滚
@ContextConfiguration({ "classpath:datasource-context-test.xml", "classpath:service-context-test.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
@Component
public class SellerTest {
@Junit
@Rollback(true)
public void testAddSeller() {
SellerBO sellerBO = getSellerBO();
try {
manageSellerServiceImpl.addSeller(sellerBO);
} catch (ServiceException csExp) {
Assert.fail();
}
}
}
我的服务代码
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void addSeller(SellerBO sellerBO) throws ServiceException {
sellerDAOImpl.addSeller(sellerDO);
}
我不知道为什么它在服务层不起作用。我已经尝试了几个解决方案 Whosebug,但 none 有效。需要帮助
使用 REQUIRES_NEW 将 运行 您的代码在新事务中与 JUnit 创建的事务分开。因此,您正在通过调用服务层代码来创建嵌套事务。
在您的服务层中将 Propagation.REQUIRES_NEW 更改为 Propagation.REQUIRED。此外,由于 Propagation.REQUIRED 是默认传播级别,您可以删除此注释。
我在回滚 insert/update postgresql 数据库中的数据时遇到问题,在服务层,而在 DAO 层它工作正常。
我的 DAO junit 测试代码
@ContextConfiguration("classpath:datasource-context-test.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public class SellerDAOTest {
@Test
@Rollback(true)
public void testAddSeller() {
try {
SellerDO sellerDO = getSellerDO();
sellerDAOImpl.addSeller(sellerDO);
} catch (DataException cdExp) {
Assert.fail();
}
}
}
我的 dao impl 看起来像
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void addSeller(SellerDO sellerDO) throws DataException {
try {
Session session = this.getSessionFactory().getCurrentSession();
session.save(sellerDO);
} catch (HibernateException hExp) {
throw new DataException("DB Error while adding new seller details", hExp);
}
}
及以上测试回滚执行测试后插入的数据。但我的问题出在我的服务层。这里没有回滚
@ContextConfiguration({ "classpath:datasource-context-test.xml", "classpath:service-context-test.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
@Component
public class SellerTest {
@Junit
@Rollback(true)
public void testAddSeller() {
SellerBO sellerBO = getSellerBO();
try {
manageSellerServiceImpl.addSeller(sellerBO);
} catch (ServiceException csExp) {
Assert.fail();
}
}
}
我的服务代码
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void addSeller(SellerBO sellerBO) throws ServiceException {
sellerDAOImpl.addSeller(sellerDO);
}
我不知道为什么它在服务层不起作用。我已经尝试了几个解决方案 Whosebug,但 none 有效。需要帮助
使用 REQUIRES_NEW 将 运行 您的代码在新事务中与 JUnit 创建的事务分开。因此,您正在通过调用服务层代码来创建嵌套事务。
在您的服务层中将 Propagation.REQUIRES_NEW 更改为 Propagation.REQUIRED。此外,由于 Propagation.REQUIRED 是默认传播级别,您可以删除此注释。