【发布时间】:2018-08-21 11:29:12
【问题描述】:
Eclipse Link Multitenancy 无法正常工作。
示例实体(架构由 liquibase 创建):
@Entity
@Table(name = "ENTITIES")
@Multitenant(MultitenantType.SINGLE_TABLE)
@TenantDiscriminatorColumn(name = "TENANT_ID", contextProperty = "eclipselink.tenant-id")
public class EntityClass
要在实体管理器上设置多租户属性,我使用了一个方面,如下所示:
@Around("execution(* javax.persistence.EntityManagerFactory.*(..))")
public Object invocate(ProceedingJoinPoint joinPoint) throws Throwable {
final Object result = joinPoint.proceed();
if (result instanceof EntityManager) {
EntityManager em = (EntityManager) result;
final String tenantId = TenantContext.getCurrentTenantId();
LOG.debug("Set EntityManager property for tenant {}.", tenantId);
em.setProperty(EntityManagerProperties.MULTITENANT_PROPERTY_DEFAULT,
tenantId);
return em;
}
return result;
}
当我启动 Spring Boot 应用程序时,它可以完美运行。为了在集成测试期间提供租户信息,我定义了一个注释:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AsTenant {
String value();
}
为了绑定这个值,我使用了TestExecutionListener:
@Override
public void beforeTestMethod(TestContext testContext) throws Exception {
final Method testMethod = testContext.getTestMethod();
final AsTenant asTenantAnnotation = testMethod
.getAnnotation(AsTenant.class);
if (asTenantAnnotation != null) {
TenantContext.setCurrentTenantId(asTenantAnnotation.value());
}
}
通过调试,我可以清楚地说TestExectionListener 在创建任何 EM 之前被调用,并且该属性已为 EM 正确设置。将任何内容持久化到数据库时,Eclipse Link 不会为该列设置值。
也许任何人都可以帮助我解决这个问题,我不知道为什么 EclipseLink 多租户不起作用。
【问题讨论】:
标签: spring-boot eclipselink multi-tenant spring-test