使用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/