每个架构问题的Spring引导多租户

时间:2017-09-02 10:46:01

标签: java spring hibernate spring-mvc spring-boot

我正在创建具有多租户支持的应用。我在GitHub上做了这个项目:https://github.com/singram/spring-boot-multitenant
它可以正常工作,同时为它手动添加模式和表。它会自动设置模式名称。但是我如何以编程方式生成模式,而不是手动生成模式?
P.S:我希望在系统注册后为用户生成模式。

1 个答案:

答案 0 :(得分:1)

要手动更新架构,您应该使用SchemaUpdate类的hibernate以及此类必须创建StandardServiceRegistry接口的引用,该接口将包含有关数据库连接和MetadataImplementor引用的信息

使用MetadataSources创建MetadataImplementor的引用。我们需要告诉hibernate为这个类创建表格MetadataSources提供方法addAnnotatedClass()

以下是

的示例
try {
    Map < String, String > map = new HashMap < String, String > ();
    map.put(Environment.HBM2DDL_AUTO, "update");
    map.put(Environment.DIALECT, "org.hibernate.dialect.MySQL5Dialect");
    map.put(Environment.DRIVER, "com.mysql.jdbc.Driver");
    map.put(Environment.URL, "jdbc:mysql://localhost:3306/" + databaseName);
    map.put(Environment.USER, "root");
    map.put(Environment.PASS, "root");
    map.put(Environment.SHOW_SQL, "false");
    StandardServiceRegistry ssr = new StandardServiceRegistryBuilder()
        .applySettings(map)
        .build();
    try {
        MetadataSources metaDataSource = new MetadataSources(ssr);
        Set < Class << ? extends Object >> classes = getClassInPackage("com.domain");
        for (Class << ? extends Object > c : classes) {
            metaDataSource.addAnnotatedClass(c);
        }
        final MetadataImplementor metadata = (MetadataImplementor) metaDataSource
                                                                    .buildMetadata();
        metadata.validate();
        SchemaUpdate su = new SchemaUpdate(ssr, metadata);
        su.setHaltOnError(true);
        su.setDelimiter(";");
        su.setFormat(true);
        su.execute(true, true);
    } finally {
        StandardServiceRegistryBuilder.destroy(ssr);
    }
} catch (GenericJDBCException e) {
    e.printStackTrace();
}

以上代码使用MYSQL数据库配置。要在包中获取实体类,我使用了reflections。您可以将以下依赖项添加到 pom.xml

<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.11</version>
</dependency>

getClassInPackage()方法的代码如下:

private Set < Class << ? extends Object >> getClassInPackage(String packagePath) {
            Reflections reflections = new Reflections(packagePath,
                new SubTypesScanner(false));
            Set < Class << ? extends Object >> allClasses =
                reflections.getSubTypesOf(Object.class);
            return allClasses;
        }