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