2017-09-02 57 views
0

我正在使用多租户支持创建应用程序。
我在GitHub上完成了这个项目:https://github.com/singram/spring-boot-multitenant
它可以正常工作,同时为它手动添加模式和表。它自动设置模式名称。但我如何以编程方式生成模式,而不是手动?
P.S:我想在用户注册到系统后为用户生成模式。每个架构问题的春季启动多租户

+0

从GitHub的链接入门404错误 –

+0

查找'SchemaUpdate'类休眠 –

+0

404被修正了 –

回答

0

要手动更新模式,您应该使用SchemaUpdate休眠类,并且必须创建一个StandardServiceRegistry接口的引用,该接口将提供有关数据库连接和MetadataImplementor引用的信息。使用MetadataSources创建参考MetadataImplementor。我们需要告诉休眠,为这个类创建表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; 
     }