使用Spring sessionFactory注入。

@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的新事务会话来创建和启动新事务。没有事务,Hibernate不会使用数据库创建Session。它创建Transaction的原因是,如果出现问题,Hibernate可以轻松回滚您在一次事务中所做的事情。

没有@Transactional,Hibernate假定您不需要与数据库进行交互。我建议在继续操作之前先阅读Spring documentation,因为您似乎对该技术的工作方式感到困惑。对正在发生的事情有一个透彻的了解,将大大提高您在编写这类东西时的效率。

关于java - Spring不标记@Transactional而不给出当前 session ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24278139/

10-16 15:32