2

我很难理解 Spring Transactions。首先,我试图尽可能少地使用 Spring。基本上,我想在 JPA/Hibernate 中使用 @Transactional 和它的一些注入功能。我的事务使用在我的服务层。我试图将它们排除在测试用例之外。我使用 CTW 并且是弹簧配置的。我现在对我的包的根目录进行了组件扫描。我还在为我的数据源、JpaTransactionManager 和 EntityManagerFactory 使用 Java 配置。我对 JpaTransactionFactory 的配置使用:

        AnnotationTransactionAspect.aspectOf().setTransactionManager( txnMgr );

我不使用@EnableTransactionManagement。

不幸的是,我很难理解@Transactional 的规则,也找不到简单描述它们的简单页面。特别是关于会话使用。例如,如果我想在没有默认无参数构造函数的类上使用 @Transactional 怎么办?

我遇到的最奇怪的问题是,在某些 POJO 服务类中,Transacitonal 工作得很好,而在其他服务类中,我可以看到正在创建的事务,但操作最终会说“没有会话或会话已关闭”。我很抱歉没有代码来重现这个,我不能把它缩小到一个小集合。这就是为什么我正在寻找最好的资源,以便我自己弄清楚。

例如,我可以有一个方法来获取一个延迟获取的子集合,遍历它并将其放入一个 Set 并返回该集合。在一个类中它可以正常工作,而在另一个也标有@Transactional 的类中,它会在尝试遍历 PersistentSet 说没有会话(即使存在事务)时失败。

也许这是因为我在测试用例中创建了这两个服务对象,而第一个以某种方式劫持了会话?

对了,我已经通读了spring源码交易文档。我正在寻找一套清晰的规则和提示来调试此类问题。谢谢。

4

1 回答 1

1

您确定您在尝试加载惰性子项的事务范围内加载了父实体吗?例如,如果它作为参数传入(即从您的@Transactional方法外部加载),那么它可能不再绑定到持久性上下文......

请注意,当没有@Transactional给出上下文时,任何与数据库相关的操作都可能会创建一个简短的 tx,然后立即关闭 - 禁用后续的延迟加载调用。这取决于您的持久性上下文自动提交配置。

简而言之,没有事务上下文的行为有时是出乎意料的,基本规则是总是有一个。如果您访问您的数据库,那么您给自己一个明确定义的 tx - 周期。使用 spring-tx,这意味着你所有的@Repository's 和@Services 都是@Transactional。这样你应该避免大多数与 tx 相关的问题。

于 2013-02-05T13:57:43.673 回答