我有一个带有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
标志,即必要的方法。
答案 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);
}