我的Spring Boot应用程序有2个架构,我将它们硬编码在Entity类中
@Entity
@Table(name"TABLE_NAME_1", schema="SCHEMA_NAME_1")
public class EntityName1{
...
}
@Entity
@Table(name"TABLE_NAME_2", schema="SCHEMA_NAME_2")
public class EntityName2{
...
}
问题在于此架构名称会不断更改每个发行版。因此,在每个发行版之后,我们都必须来到这里并对实体文件的架构名称进行必要的更改。
现在,我想我们可以在春季启动时配置default_schema,但是由于我们需要外部化这两个架构名称,因此无法正常工作。
有什么办法可以使用这样的东西: @实体 @Table(名称为“ TABLE_NAME_1”,架构=“ {{default.schema_1}}”) 公共类EntityName1 { ... }
@Entity
@Table(name"TABLE_NAME_2", schema="{{default.schema_2}}")
public class EntityName2{
...
}
我们在外部文件中定义default.schema_1和default.schema_2。
答案 0 :(得分:1)
请试试这个...
public class SystemProps {
private static Map<String,String> props = null;
public static void loadPropsAll(){
props = new HashMap<>();
File file = null;
try {
file = ResourceUtils.getFile("classpath:application.properties");
loadProps(file,props);
String x = SystemProperties.get("spring.profiles.active");
if(x != null) {
file = ResourceUtils.getFile("classpath:application-" + x + ".properties");
loadProps(file, props);
}
}catch (Exception e){e.printStackTrace();}finally {
}
}
private static void loadProps(File file, Map<String,String> props){
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
while (br.ready()){
String line = br.readLine();
System.out.println(line);
if(!line.startsWith("#") && line.indexOf("=")!=-1){
props.put(""+line.split("=")[0].trim(), line.split("=")[1].trim());
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static String getProp(String name){
if(props==null)
loadPropsAll();
return props.get(name);
}
}
public class CustomPhysicalNamingStrategy extends SpringPhysicalNamingStrategy {
@Override
public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironment) {
if(name.getText().startsWith("$")){
String x = name.getText().replace("$","").replaceAll("\\{","").replaceAll("}","");
String schema = SystemProps.getProp(x);
return super.toPhysicalSchemaName(new Identifier(schema,name.isQuoted()), jdbcEnvironment);
}
return super.toPhysicalSchemaName(name, jdbcEnvironment);
}
}
spring.jpa.hibernate.naming.physical-strategy=my.package.CustomPhysicalNamingStrategy
my_schema_name_property=SCHEMA_NAME_2
现在可以使用了
@Entity
@Table(name"TABLE_NAME_1", schema="${my_schema_name_property}")
public class EntityName1{
...
}
答案 1 :(得分:0)
您只能在运行时使用反射更改架构的值(或与此相关的任何其他注释值)。例如,如何做看起来像here。
然后,您可以创建一个实现ApplicationListener<ApplicationReadyEvent>
的bean,该bean将执行方法onApplicationEvent
,在您的应用程序启动后,该方法将更改特定实体类上的架构值。