【问题标题】:Schema validation in multi tenancy using hibernate使用休眠的多租户模式验证
【发布时间】:2017-11-07 21:28:59
【问题描述】:

基于

的多租户应用程序如何工作

独立数据库:每个租户都有自己的数据库。;

是否进行架构验证?

hibernate.hbm2ddl.auto validate 正常使用,

如果动态添加新租户,是否可以进行架构验证?

【问题讨论】:

  • 您设法解决了这个问题吗?我面临同样的问题。架构验证查询可能不知道数据源是什么。
  • 在应用程序启动之前,我尝试覆盖 hibernate.hbm2ddl.auto 验证方法并传递所有注册的租户数据库
  • 嗨@Cork Kochi,你解决了这个问题吗?你能分享一下解决方案吗?

标签: mysql hibernate multi-tenant


【解决方案1】:

试试看:

@ConditionalOnExpression("${multitenancy.enabled:true} and '${spring.jpa.hibernate.ddl-auto}'.equals('validate')")
@Component
public class DDLSchemaValidator implements ApplicationRunner {
    @Autowired
    private BeanFactory beanFactory;
    @PersistenceUnit
    private EntityManagerFactory emf;

    private String[] tenants = {"tenant-1", "tenant-2", "tenant-3", "tenant-4"};

    public void run(ApplicationArguments args) {
        PersistenceUnitInfo persistenceUnitInfo = this.getPersistenceUnitInfo();

        SessionFactoryImpl sessionFactory = this.emf.unwrap(SessionFactoryImpl.class);
        ServiceRegistry serviceRegistry = sessionFactory.getServiceRegistry().getParentServiceRegistry();

        MetadataSources metadataSources = new MetadataSources(serviceRegistry);
        List<String> managedClassNames = persistenceUnitInfo.getManagedClassNames();
        for (String managedClassName : managedClassNames) {
            metadataSources.addAnnotatedClassName(managedClassName);
        }

        for (String tenantId: this.tenants) {
            MetadataBuilder metadataBuilder = metadataSources.getMetadataBuilder();
            metadataBuilder.applyImplicitSchemaName(tenantId);
            new SchemaValidator().validate(metadataBuilder.build());
        }
    }

    private PersistenceUnitInfo getPersistenceUnitInfo() {
        List<String> packagesToScan = EntityScanPackages.get(this.beanFactory).getPackageNames();
        if (packagesToScan.isEmpty() && AutoConfigurationPackages.has(this.beanFactory)) {
            packagesToScan = AutoConfigurationPackages.get(this.beanFactory);
        }

        DefaultPersistenceUnitManager persistenceUnitManager = new DefaultPersistenceUnitManager();

        String[] packagesToScanArr = StringUtils.toStringArray(packagesToScan);
        persistenceUnitManager.setPackagesToScan(packagesToScanArr);
        persistenceUnitManager.afterPropertiesSet();

        return persistenceUnitManager.obtainDefaultPersistenceUnitInfo();
    }
}

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2012-01-11
  • 2014-02-14
  • 1970-01-01
  • 2013-03-30
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多