Spring没有标记@Transactional而没有给出当前会话

时间:2014-06-18 06:06:05

标签: java spring hibernate

使用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 时,它正常工作。 但我不希望为此方法启用任何事务。

我错过了什么......?

1 个答案:

答案 0 :(得分:1)

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

如果没有@Transactional,Hibernate会假定您不需要与数据库进行交互。我建议你继续阅读Spring documentation,因为你似乎对这项技术的运作方式感到很困惑。通过了解正在发生的事情,将大大提高您在撰写此类内容时的效率。