【问题标题】:Hibernate + Spring transaction rollback not workingHibernate + Spring事务回滚不起作用
【发布时间】:2012-10-17 03:07:57
【问题描述】:

当服务抛出配置为回滚(rollbackfor)的异常时,此回滚不起作用。

服务类:

@Service("bookService")
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = { BusinessException.class }, readOnly = true)
public class BookServiceImpl implements BookService {

    @Autowired
    private BookRepository bookDAO;

     @Override
     @Transactional(readOnly = false)
     public void transactionTest(Book book) throws BusinessException {
          try {
               bookDAO.test(book);
          } catch (DAOException e) {
               throw new BusinessException("test rollback - service");
          }
     }
}

存储库类:

@Repository("bookRepository")
public class BookRepositoryImpl implements BookRepository {

    @Autowired
    private SessionFactory sessionFactory;

@Transactional(readOnly = false)
@Override
public Book saveOrUpdate(Book book) {
    if (book.getId() != null) {
        getSession().merge(book);
    } else {
        getSession().save(book);
    }
    return book;
}

@Transactional(readOnly = false)
@Override
public void test(Book book) throws DAOException {

    saveOrUpdate(book);
    System.out.println(book.getTitle() + " inserted!");
    throw new DAOException("Test rollback");
}

}

回滚在一种情况下有效。为此,我需要更改 BookServiceImpl 删除 readOnly = true 并删除“transactionTest”方法的“@Transactional(readOnly = false)”。但出于安全原因,我希望对所有类都使用 readOnly = true 并指定使用 readOnly = false 的方法是什么

【问题讨论】:

    标签: spring hibernate transactions rollback


    【解决方案1】:

    目前整个BookServiceImpl事务配置为@Transactional(propagation = Propagation.REQUIRED, rollbackFor = { BusinessException.class }, readOnly = true)

    而对于transactionTest,重写的注解是@Transactional(readOnly = false),当您使用类重写注解以更新方法的整个注解而不是仅指定属性时。

    而不是这个,你应该有下面BookServiceImpl的代码

    @Service("bookService")
    @Transactional(readOnly = true)
    public class BookServiceImpl implements BookService {
    
        @Autowired
        private BookRepository bookDAO;
    
         @Override
         @Transactional(propagation = Propagation.REQUIRED, rollbackFor = { BusinessException.class },readOnly = false)
         public void transactionTest(Book book) throws BusinessException {
              try {
                   bookDAO.test(book);
              } catch (DAOException e) {
                   throw new BusinessException("test rollback - service");
              }
         }
    }
    

    如果您想要在 DAO(存储库)级别上进行相同类型的事务,请指定它或让服务来处理事务(假设存储库不会直接与客户端交互)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      相关资源
      最近更新 更多