我有一个带有 JPA/Hibernate 的 Spring Boot 2.x 应用程序和 2 个独立的事务管理器:每个租户 1 个,应用程序范围 1 个。所有实体、存储库和服务都分离在不同的包中。
每当我在服务中使用 @Transactional
时,我都需要将 txManager 显式限定为 @Transactional(value = "tenantTransactionManager")
或 @Transactional (值=“applicationTransactionManager”)
。
这非常冗长且容易出错,因为它们只是文字字符串。
有没有办法可以在包级别设置事务管理器,这样我就不必在每次使用时都显式设置它?
基于 Multiple transaction managers with @Transactional annotation 中给出的答案,我创建了一个 @TenantTransactional
和 @ApplicationTransactional
元注释,但这不允许我设置 readOnly
标志,这是必要的 -方法。
最佳答案
给定the answer事实上,您已经有了 @TenantTransactional
和 @ApplicationTransactional
您只需使用 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 注释的其他属性执行此操作。
关于java - 在@Transactional注释中设置默认事务管理器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56665811/