【发布时间】:2019-07-10 16:50:07
【问题描述】:
我对@Transactional 注释有很多困惑。
1) 如果我只使用声明性方法,是否足以将我的服务类/方法标记为 @Transactional,或者我应该创建配置 bean 和属性,如 Baeldung article 所示?
2) 在某些情况下,我甚至需要使用编程方法,以便能够在工作流程的特定点显式调用 flush()。在这种情况下,以前的休眠配置定义是强制性的吗?
【问题讨论】:
-
@Transactional确保您的方法封装在事务中。有时,您必须在事务中间调用 flush 来“更新”数据库的状态,例如当您从数据库中删除内容然后尝试从中选择时。删除后不刷新,您的选择可能无法正常工作。 -
@NathanHughes 考虑到配置中的信息非常通用,我希望 Hibernate 能够“猜测”它们,即读取其中许多设置已经指定的 application.properties。如果第一个答案不是“是”,那么第二个问题就会有意义,就像看起来那样。 ayrton 我的交易包含一个 cicle,在其中每次迭代都调用对上一次迭代引用的实体的引用。然后我必须显式调用flush(),否则在第二次迭代中Spring会抱怨第一个的引用仍然是瞬态的。
-
@NathanHughes 在提交之前,PlatformTransactionManager 会要求 Hibernate 刷新会话。
标签: java spring hibernate spring-boot transactional