Spring Hibernate @Transactional澄清

时间:2019-02-16 21:54:41

标签: java spring hibernate spring-boot transactional

我对@Transactional注释感到困惑。

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

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

1 个答案:

答案 0 :(得分:3)

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

是的,将Transactional注释放在类或方法上足以进行事务。如果未在DataSource级别完成,则自动提交甚至应该自动关闭(出于优化目的)。

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


关于使用声明性注释方法的一些重要说明。

请记住要注释public方法。无法通过Java代理或CGLIB代理来管理任何其他方法可见性,因此,即使您没有注意到,这些方法也不会参与事务上下文。对于protectedprivate方法,您不得不使用AspectJ。

还请记住,使用代理时,自调用(并期望进行新交易)不起作用。


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

PlatformTransactionManager允许对事务进行更多的自定义,而TransactionTemplate更多地是一个实用程序对象(但是可以根据需要进行建模)。

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