我在我的项目中引入了HibernateTransactionManager,因为我们需要在某些服务方法中使用事务。我还遵循了将SessionFactory注入DAO层而不是实现HibernateDaoSupport的最佳实践。
现在,在一些没有使用@Transactional注释的读取方法中,我得到了错误:
No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
我知道如何解决这个问题,只需在整个地方添加@Transactional就行了。但我的同事们担心的是表现。还应阅读以下方法:
return sessionFactory.getCurrentSession().createCriteria(MyClass.class).add(Restrictions.eq("color", color)).addOrder(Order.asc("createDate")).list();
用@Transactional来注解?
我还读过这篇文章对Spring @事务性注释方法的几点澄清,它不鼓励在DAO层中使用这个注释,所以我看不出消除问题的最佳实践是什么,并且在读取方法上有很好的性能。
非常感谢你的帮助!
发布于 2015-02-11 11:01:17
当您使用弹簧TransactionManager抽象时,必须始终用以下内容标记所有服务方法:
@Transactional
@Transaction(readOnly = true)
这是因为Hibernate不再管理事务,而是将这一责任委托给Spring框架。除非用@Transactional
注释标记每个事务边界方法,否则Spring不能将当前线程与Hibernate会话和相关的JDBC连接关联起来。
因此,使用@Transactional
不是一种选择。
https://stackoverflow.com/questions/28452009
复制相似问题