在@Transactional注释中设置默认的交易管理器?

时间:2019-06-19 10:43:29

标签: java spring hibernate jpa

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

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

由于它们只是文字字符串,因此非常冗长且容易出错。

有没有办法在包装级别上设置事务管理器,因此我不必在每次使用时都明确设置它?

根据Multiple transaction managers with @Transactional annotation中给出的答案,我创建了一个@TenantTransactional@ApplicationTransactional元注释,但这不能让我设置readOnly标志,即必要的方法。

2 个答案:

答案 0 :(得分:1)

鉴于the answer,并且您已经拥有@TenantTransactional@ApplicationTransactional的事实,您只需为readOnly使用alias。可以使用@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批注的其他属性执行此操作。

答案 1 :(得分:0)

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

<块引用>
  @Primary
  @Bean
  public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
    return new JpaTransactionManager(entityManagerFactory);
  }
相关问题