我正在创建具有多租户支持的应用程序。
我在 GitHub 上的这个项目中做的那样:https : //github.com/singram/spring-boot-multitenant
当手动为其添加架构和表时,它工作正常。它会自动设置模式名称。但是我如何以编程方式而不是手动生成模式?
PS:我想在用户在系统中注册后为他生成模式。
要手动更新架构,您应该使用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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句