2012-10-17 113 views
1

当服务发生配置为回滚(rollbackfor)的异常时,此回滚无效。Hibernate + Spring事务回滚不起作用

服务类:

@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的=适用于所有类,并指定什么方法使用readOnly的=假

目前

回答

3

对整个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(库)的水平,那么其指定或只是让服务照顾有关事务(假定存储库不会直接与客户端接口)。