hibernate回滚不在服务层中工作

时间:2015-06-11 14:30:47

标签: hibernate postgresql transactions junit4 spring-4

我在postgresql数据库中,在服务层中的回滚插入/更新数据中存在问题,在DAO层中,它正常工作。

我的DAO junit测试代码

module Utility

  #
  # This module just contains useful functions
  #

  class Array
    def concat_with(seperator = "")
      reject! { |c| c.empty? }.join(seperator)
    end
  end

  class Float
    def flat
      "%gx" % (self / 100.00)
    end
  end

end

我的dao impl看起来像

@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();
        }

    }
}

以上测试回滚执行测试后插入的数据。但我的问题是在我的服务层。回滚没有发生在这里

@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();
        }

    }
}

我不知道它为什么不在服务层工作。我已经尝试了几个解决方案stackoverflow,但没有一个工作。需要帮助

1 个答案:

答案 0 :(得分:0)

使用REQUIRES_NEW将在新事务中独立于JUnit创建的事务运行代码。因此,您通过调用服务层代码来创建嵌套事务。

将Propagation.REQUIRES_NEW更改为服务层中的Propagation.REQUIRED。此外,由于Propagation.REQUIRED是默认传播级别,因此您可以删除此注释。