在读取方法上使用@Transactional 摆脱 "No Hibernate Session bound to thread" 和性能

Getting rid of "No Hibernate Session bound to thread" and performances with @Transactional on read methods

我的项目中引入了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 注释?

我也读过这个 post Some clarification about Spring @Transactional annotation on a method 不鼓励在 DAO 层中使用这个注释,所以我看不出解决这个问题的最佳实践是什么 并且在读取方法上有很好的表现

非常感谢您的帮助!

当您使用 Spring TransactionManager 抽象时,您必须始终将所有服务方法标记为:

  • @Transactional
  • @Transaction(readOnly = true) 对于只读方法

那是因为 Hibernate 将不再管理事务,而是将此职责委托给 Spring 框架。除非您使用 @Transactional 注释标记每个事务边界方法,否则 Spring 无法将当前线程与 Hibernate 会话和关联的 JDBC 连接相关联。

因此,使用 @Transactional 不是一个选项。