gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:50:14 26 4
gpt4 key购买 nike

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

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