代码之家  ›  专栏  ›  技术社区  ›  Ladu anand

在运行时Spring中设置@Table

  •  0
  • Ladu anand  · 技术社区  · 8 年前

    我正在编写一个spring服务,使用JPA连接到我的PostgreSQL服务器。我面临的问题是如何在运行时将@Table设置为一个值。我有两张桌子,一张用于QA,另一张用于prod。因此,当我执行jar时,我将概要文件设置为QA或prod,但我无法获得如何将@Table设置为给定概要文件的对应表。

    java -jar -Dspring.config.location=.\vmconfig -Dspring.profiles.active=qa postgre-1.0.1.jar
    
    Properties File
    
    server.port= 6869   
    spring.datasource.driver-class-name=org.postgresql.Driver
    spring.datasource.url=jdbc:postgresql://xxx-xxx/DB
    spring.datasource.username=postgres
    spring.datasource.password=xxxx
    spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
    spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
    spring.jpa.generate-ddl=true
    spring.jpa.show-sql=true
    spring.jpa.hibernate.ddl-auto=none
    

    @表(名称=<>)-->应该在运行时根据执行jar的概要文件设置名称。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Reg    8 年前

    您有三种选择:

    (推荐)

    您可以定义orm.xml。使用它,可以覆盖实体的表名。

    对于您的情况,您只希望它用于指定的配置文件。为此,您需要创建 LocalContainerEntityManagerFactoryBean . (而不仅仅是设置属性)( Example here

    在…上 LocalContainerEntityManagerFactoryBean

    例如:

    @Bean
    @Profile("QA")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
        LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
        bean.setDataSource(dataSource);
        bean.setJpaVendorAdapter(jpaVendorAdapter);
        bean.setPackagesToScan("com.example.demo");
        bean.setMappingResources("orm.xml");
        return bean;
    }
    

    此配置应仅应用于所需的配置文件。

    下面是orm.xml的一个简单示例

    <entity-mappings version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm
    http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd">
    
    <entity class="com.example.demo.EntityName">
        <table name="NEW_TABLE_NAME"></table>
    </entity>
    

    *感谢@BillFrost指出这一点。

    @每个环境的EntityScan

    @EntityScan 每个环境配置。因此,只扫描QAConfiguration中的QA实体。这要求您使用@Table中定义的不同名称创建重复的实体。

    我真的不喜欢这样,因为这会导致您必须维护实体的QA集和生产集。

    覆盖SpringPhysicalNamingStrategy

    @Bean
    public SpringPhysicalNamingStrategy springPhysicalNamingStrategy() {
        return new SpringPhysicalNamingStrategy() {
            @Override
            public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
                // Just change find and replace your table name
                return super.toPhysicalTableName(new Identifier( name.getText(), false), jdbcEnvironment);
            }
        };
    }
    

    **另外:只需检查如何构造 Identifier