java - Spring Hibernate @Transactional 说明

标签 java spring hibernate spring-boot transactional

我对@Transactional 注释有很多困惑。

1) 如果我只使用声明性方法,是否足以将我的服务类/方法标记为@Transactional,或者我是否应该创建配置 bean 和属性,如本 Baeldung article 所示?

2) 在某些情况下,我什至需要使用编程方法,以便能够在我的工作流的特定点显式调用 flush()。在这种情况下,以前的 hibernate 配置定义是强制性的吗?

最佳答案

如果您在 Spring Boot 项目中,则不需要显式声明 SessionFactoryPlatformTransactionManager Beans。它们将为您自动配置。

是的,将 Transactional 注释放在您的类或方法上就足以让事务发生。自动提交甚至应该自动关闭(出于优化目的),以防未在 DataSource 级别完成。

对于“程序化”部分,您应该考虑留在注释方面。您可以使用事务传播 策略来隔离某些操作。


关于使用声明式注解方法的几个重要注意事项。

如果可能,请记住注释 public 方法。任何其他方法的可见性都无法通过 Java 代理或 CGLIB 代理进行管理,因此,即使您不会注意到,这些方法也不会参与事务上下文。对于 protectedprivate 方法,您必须使用 AspectJ。

还请记住,在使用代理时, self 调用(并期待新交易)不起作用。


要使用编程方法,您只需Autowire TransactionTemplatePlatformTransactionManager Bean。

PlatformTransactionManager 允许对交易进行更多自定义,而 TransactionTemplate 更像是一个实用对象(但是可以根据需要建模)。

显然,不要在同一个方法调用堆栈中混合使用这两种方法。

关于java - Spring Hibernate @Transactional 说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54728039/

相关文章:

java - 使用 Jersey 客户端执行带有请求参数和请求正文的 POST 操作

java - 为什么测试需要永远执行

java - Glassfish 服务器提前退出,退出代码为 134

java - 使用 MultipartResolver 上传 Spring 文件。空指针异常

java - 使用带有套接字的 Javas 对象流的性能问题

java - 由于 Solr 依赖性,Spring Actuator 状态下降

java - 无法使用 spring-boot-devtools 运行 2 个 Web 服务器

java - Spring Security,始终重定向到登录页面

java - 生成 Hibernate 映射文件时未创建注释

java - PersistenceUnitUtil 中 isLoaded(Object) 方法的用法