gpt4 book ai didi

java - 摆脱 "No Hibernate Session bound to thread"并在读取方法上使用 @Transactional 进行性能

转载 作者:行者123 更新时间:2023-11-30 03:33:51 25 4
gpt4 key购买 nike

我在项目中引入了HibernateTransactionManager,因为我们需要在某些服务方法中使用事务。我还遵循最佳实践,将 SessionFactory 注入(inject) 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进行注释?

我也读过这篇文章Some clarification about Spring @Transactional annotation on a method不鼓励在 DAO 层使用此注释,因此我不知道摆脱该问题的最佳实践是什么并且在读取方法上具有良好的性能

非常感谢您的帮助!

最佳答案

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

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

这是因为 Hibernate 将不再管理事务,而是将这个责任委托(delegate)给 Spring 框架。除非您使用 @Transactional 注解标记每个事务边界方法,否则 Spring 无法将当前线程与 Hibernate session 和关联的 JDBC 连接关联起来。

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

关于java - 摆脱 "No Hibernate Session bound to thread"并在读取方法上使用 @Transactional 进行性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28452009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com