@Transaction中的Session会发生什么变化?

4

你好,我已经在办公室的代码中寻找了一个错误已经长达一周之久。它与Spring、Hibernate和Transactions有关。

我的了解:
1. 延迟加载。
2. Spring如何使用代理和拦截器进行事务管理。
3. Spring中的事务传播以及我们的代码使用默认值REQUIRED。
4. 请求/会话的每个Session和Hibernate的分离实体基本原理,以保持会话,并且我们的不是每个会话的Session。

我的情景: 我的代码中有一个方法(由其他人编写)使用@Transactional( -称之为方法a())并调用另一个服务方法,该方法使用Hibernate从DB加载客户机( -称之为方法b())。b()也有@Transactional。客户有许多延迟字段,在控制返回到方法a()时,延迟字段无法加载因为Session已关闭。我不明白的是-当方法a()尚未完成时,为什么会话已关闭? b()完成后,Spring对会话做了什么?我不介意指向一个网址。

我还有更多的问题,因为我现在已经搞了一周了,但是不想在不理解会话情况下污染此帖子。

请建议。


这两个方法使用不同的事务管理器吗? - kdgregory
很遗憾,目前我只能从配置中看出来。但是有没有一种可靠的方法来确认呢? - Asif
我可以想象以下原因:传播实际上是REQUIRES_NEW,或者tx管理器不同,或者方法b()没有获取当前会话而是初始化了另一个会话,或者方法b()被调用的线程与调用a()的线程不同。没有看到任何代码,很难回答。 - JB Nizet
线程是相同的,并且确保没有openSession,只使用getCurrentSession()。我越来越困惑了。因为在方法a()中,sessionFactory.getCurrentSession()给我一个错误,说没有将当前会话绑定到线程上(既然我在方法a()上有Transactional注释,那么我不应该在这里得到一个吗?),但如果我写另一个方法c(),在调用b()后从a()中调用它,并从c()中执行sessionFactory.getCurrentSession(),它会给我当前的会话(c()也有Transactional注释)。这里发生了什么? - Asif
根据上面的评论,a()是否给我错误是因为currentSession绑定到不同的上下文,比如JTATransaction从不同的上下文中读取,比如正在运行的线程?我很困惑 :) - Asif
显示剩余2条评论
1个回答

0

在你的Service方法中保留@Transactional。从同一个Service方法a()中进行getXXX()调用,以加载返回实体对象上的延迟属性。还有另一个很酷的选择:Hibernate Fetch Profiles。在实体中定义Fetch Profile,并从你的Service或Dao中激活它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接