【问题标题】:Set default Transaction Manager in @Transactional annotations?在@Transactional 注释中设置默认事务管理器?
【发布时间】:2019-11-02 02:00:44
【问题描述】:

我有一个带有 JPA/Hibernate 的 Spring Boot 2.x 应用程序和 2 个单独的事务管理器:每个租户 1 个和应用程序范围内的 1 个。所有实体、存储库和服务都分开在不同的包中。

每当我在我的服务中使用 @Transactional 时,我都需要明确地将 txManager 限定为 @Transactional(value = "tenantTransactionManager")@Transactional(value = "applicationTransactionManager")

这是非常冗长且容易出错的,因为它们只是文字字符串。

有没有办法可以在包级别设置事务管理器,这样我就不必在每次使用时都明确设置?

根据Multiple transaction managers with @Transactional annotation 中给出的答案,我创建了@TenantTransactional@ApplicationTransactional 元注释,但这不允许我设置readOnly 标志,这是每个方法所必需的。

【问题讨论】:

  • 只需添加 readOnly 并将别名与 @AliasFor 一起使用。

标签: java spring hibernate jpa


【解决方案1】:

鉴于the answer 以及您已经拥有@TenantTransactional@ApplicationTransactional 的事实,您可以简单地将alias 用于readOnly。可以使用@AliasFor 添加别名。

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional("tenantTransactionManager")
public @interface TenantTransactional {

  @AliasFor(attribute="readOnly", annotation=Transactional.class)
  boolean readOnly() default false;
}

当然,您也可以对@Transactional 注释的其他属性执行此操作。

【讨论】:

    【解决方案2】:

    要设置将使用的默认事务管理器,您可以使用 @Primaty 注释您的事务管理器创建 bean,例如:

      @Primary
      @Bean
      public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
      }
    

    【讨论】:

      猜你喜欢
      • 2019-01-09
      • 2011-03-20
      • 2023-02-16
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 2019-08-16
      • 2011-03-22
      • 1970-01-01
      相关资源
      最近更新 更多