当前位置: 首页 > 知识库问答 >
问题:

摆脱“没有Hibernate会话绑定到线程”和@Transactional on read方法的性能

邵阳辉
2023-03-14

我已经在我的项目中引入了HibernateTransactionManager,因为我们需要对某些服务方法使用事务。我还遵循了将SessionFactory注入DAO层的最佳实践,而不是实现HibernateDaoSupport。

现在,在一些没有用@transactional注释的read方法中,我得到了一个错误:

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@Transactional注释的一些澄清,该注释不鼓励在DAO层中使用该注释,所以我不知道什么是解决该问题并在read方法上具有良好性能的最佳实践。

共有1个答案

高兴贤
2023-03-14

使用Spring TransactionManager抽象时,必须始终用以下标记所有服务方法:

  • @transactional
  • @transaction(readOnly=true)用于只读方法

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

因此,不能使用@transactional

 类似资料:
  • 问题内容: 我正在尝试在一个测试用例中访问当前的hibernate会话,并收到以下错误: org.hibernate.HibernateException:没有绑定到线程的Hibernate会话,并且配置不允许在org.hibernate.impl的org.springframework.orm.hibernate3.SpringSessionContext.currentSession(Spri

  • servlet 可以按名称绑定对象属性到 HttpSession 实现,任何绑定到会话的对象可用于任意其他的 servlet,其属于同一个 ServletContext 且处理属于相同会话中的请求。 一些对象可能需要在它们被放进会话或从会话中移除时得到通知。这些信息可以从 HttpSessionBindingListener 接口实现的对象中获取。这个接口定义了以下方法,用于标识一个对象被绑定到会

  • 问题内容: 我在调用使用的DAO方法时遇到此异常。DAO类带有注释,我也已经在应用程序上下文配置文件中声明了。 我可以调用执行HQL查询的DAO方法,但是每当我调用首先获取Hibernate会话的DAO方法时,就会遇到此异常: 我有以下应用程序上下文配置文件: 通用DAO类(从中扩展了我的程序中使用的DAO)如下所示: 我的应用程序从应用程序上下文获取DAO: 当我尝试保存实体时会遇到异常: DA

  • 问题内容: 我收到以下错误 服务等级 DAO类 我在我的application-context.xml中有这个 谁能发现我为什么出现以下错误? 问题答案: 您使用@Transactional为Dao类添加了注释,但没有为服务类添加注释。该行: 要求您进行交易。 您可以通过将@Transactional批注添加到ProfileService类,或者只添加registerVisitor()方法来解决此

  • 我得到以下错误 服务级别 刀类钻头 这个在我application-context.xml 有人能指出为什么我会得到下面的错误吗?

  • 问题内容: 我知道会话不是线程安全的。我的第一个问题:将实体传递给另一个线程,对它做一些工作,然后将其传递回原始线程并进行更新,是否安全? 我的第二个问题:在一个线程中创建一个实体并将其保存在另一个线程中是否安全? 编辑 我忘了提到实体是为快速加载而专门配置的 问题答案: 否。该实体已附加到会话中,并包含链接到该会话的代理(以延迟自身加载)。因此,这样做将使用多个线程中的会话。由于会话不是线程安全