java - Spring在没有标记@Transactional的情况下不会提供当前 session

标签 java spring hibernate

使用 Spring sessionFactory 注入(inject)。

@SuppressWarnings("unchecked")
    public void getData() {
        System.out.println("%%%% Hibernate fetching data %%%% ");
        Session session = factory.getCurrentSession();
        /*
         * try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO
         * Auto-generated catch block e.printStackTrace(); }
         */
        List<Address> addresses = session.createQuery("from Address").list();
        System.out.println("Total Connectins = "
                + factory.getStatistics().getConnectCount());
        for (Address address : addresses) {
            System.out.println(address);
        }
    }

上面的代码给出了异常

org.hibernate.HibernateException: No Session found for current thread

但是当这个方法被标记为@Transactional时,它就可以正常工作了。 但我不希望为此方法启用任何事务。

我错过了什么吗?

最佳答案

这就是交易的运作方式。通过标记该方法 @Transactional,您将要求 TransactionManager 使用来自 SessionFactory 的新事务 session 创建并启动新事务。如果没有事务,Hibernate 就不会与数据库创建Session。它创建 Transaction 的原因是,如果出现问题,Hibernate 可以轻松回滚您在一个事务中所做的事情。

如果没有@Transactional,Hibernate 会假定您不需要与数据库交互。我建议阅读Spring documentation在继续之前,因为您似乎对该技术的工作原理感到非常困惑。彻底了解正在发生的事情将大大提高您在编写此类内容时的效率。

关于java - Spring在没有标记@Transactional的情况下不会提供当前 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24278139/

相关文章:

java - Keycloak 7.0.1 和 MySQL (RDS) SSLHandshakeException : No appropriate protocol (protocol is disabled or cipher suites are inappropriate) for review

java - 部署后无法访问 Google App Engine 中的 Spring Boot 应用程序

java - for循环中增量整数不会增加2

java - 使用 spring-data-mongodb 进行审计

java - 在 spring-boot 1.4.x 中添加原因短语

java - 有没有办法将相同的 hibernate 实体映射到不同方案中的多个表

java - sql 查询在 sqlDeveloper 中运行时有效,但在使用 hibernate 时无效

java - 使用 EntityManager 更新 Hibernate

java - 我们可以使用Java在Map中一次放入多个键和值吗

java - tomcat v.7.0.61 中的 web.xml 错误