当前位置: 首页 > 知识库问答 >
问题:

Spring Boot JPA将架构名称外部化为属性文件

戚逸清
2023-03-14

我的spring boot应用程序有两个模式,我在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{
...
}

问题是这个模式名称在每次发布时都会不断更改。因此,每次发布之后,我们都必须来到这里,对实体文件的模式名进行必要的更改。

现在我想我们可以在Spring引导中配置default_schema,但这行不通,因为我们需要外部化两个模式名称。

有什么方法可以这样使用:@Entity@Table(name“Table_name_1”,schema=“{{default.schema_1}}”)公共类EntityName1{…}

@Entity
@Table(name"TABLE_NAME_2", schema="{{default.schema_2}}")
public class EntityName2{
...
}

定义default.schema_1和default.schema_2在外部文件中。

共有2个答案

丌官嘉福
2023-03-14

您可以在运行时仅通过反射更改模式的值(或任何其他注释值)。例如如何做到这一点看这里。

然后您可以创建bean实现Application ationListener

欧奇希
2023-03-14

请试试这个。。。

  1. 创建类SystemProps
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{
...
}

 类似资料:
  • 我想将@EnableJPARepositories基本包的配置外部化。 我有两个不同的样品包如下 com。项目道博士 我尝试了下面的属性外部化(不适用于多个包) ProjectConfig.class 配置。性质 对于多个包,是否有其他方法将此配置外部化? 谢谢

  • 我知道有很多关于这个的线程,但还没有一个解决我的问题。我有一个在Eclipse中运行的Spring Boot应用程序,我将参数外部化,以便部署到外部Tomcat并使属性远离战争。我将application.properties从src/main/Resources移至APP_ROOT/config。在catalina.sh,我添加了这个: 外部构建工作正常;然而,现在它不再从日食开始。我通过在启动

  • 我希望在运行时传递变量,一旦war文件部署在tomcat上。如何使用classplath中的application.properties以及另一个属性文件ex。abcd.properties位于specific directory.am基本上希望设置额外的类路径,并从该路径中的属性文件中读取值,以及war部署的默认类路径位置。 我使用Spring boot。其中一种方法是将所有属性传递到数据库端,

  • 我构建了一个访问数据库并从中提取数据的Spring-Boot应用程序。一切正常,但我想从外部. Properties文件配置表名。 比如: 我想找点东西,但没找到。 您可以使用注释访问外部属性。 所以我的问题是:有没有办法配置表名?或者我可以更改/拦截hibernate发送的查询吗? 解决方案: 好的,hibernate 5适用于。所以我创建了自己的。 此外,这篇关于NamingStrategy的

  • 问题内容: 这是一个不起作用的简单go程序: 错误: prog.go:18:无效的操作:v [属性](*顶点类型的索引) 我想要的是使用名称访问Vertex X属性。如果我这样做,它会起作用,但不会。 有人可以告诉我如何进行这项工作吗? 问题答案: 大多数代码都不需要这种动态查找。与直接访问相比,它效率低下(编译器知道Vertex结构中X字段的偏移量,可以将vX编译为单个机器指令,而动态查找则需要

  • 我在Tomcat中部署了基于Spring Boot的war文件。我无法使用外部应用程序属性文件。我正在使用follows提供外部属性文件的路径 我也用qoutes试过 这些属性不起作用,spring正在读取绑定在war文件中的属性文件。有谁能帮我一下吗?谢谢