如何在spring-data-jdbc中指定表架构

问题描述

在我的项目中,我使用的是spring-data-jdbc版本2.0.4.RELEASE,但我一直困扰于如何为表指定架构的问题。实体类看起来像这样

@Data
@Table(value = "alpha.op_organization")
public class OrganizationEntity {
   @Id
   private Long id;
   @Column(name="name")
   private String name;
}

如果我尝试使用jdbc存储库方法save这样保存实体

OrganizationEntity organization = new OrganizationEntity();
organization.setName("OrgName1");
organizationRepository.save(organisation)

我有一个异常“版本alpha.op_organization不存在。对应的SQL查询

INSERT INTO "alpha.op_organization" ("name") VALUES (?)

I。 e。事实证明,我们正在尝试在表“ alpha.op_organization”中而不是在架构alpha的表op_organization中插入条目。

我试图自定义NamingStrategy以返回架构字母,但是没有运气。

@Configuration
public class AppConfig extends AbstractJdbcConfiguration {
   @Bean
   public NamingStrategy namingStrategy() {
      return new NamingStrategy() {

         @Override
         public String getSchema() {
            return "alpha";
         }
      };
   }
}

有什么方法可以在spring-data-jdbc中指定表模式吗?

解决方法

当前,执行此操作的方法是定义NamingStrategy。来自this integration测试的示例:

@Bean
NamingStrategy namingStrategy() {
    return new NamingStrategy() {
        @Override
        public String getSchema() {
            return "other";
        }
    };
}
,

我使用 postgresql + HikariDataSource。 所以就我而言:

 @Bean
 public DataSource dataSource() {

        HikariConfig hikariConfig = new HikariConfig();
...
        if(schema != null && !schema.isEmpty()){
            hikariConfig.setConnectionInitSql("SET SEARCH_PATH TO " + schema);
        }
        
        HikariDataSource dataSource = new HikariDataSource(hikariConfig);
        return dataSource;
  }

实体注释如下: @Table("用户") 正确映射到 service.user

,

在 JDBC 连接 url 中分配 currentSchema 参数。

示例:jdbc:postgresql://server/catalog?currentSchema=schema

这让我在不同的表名方面更加灵活,但无需在 @Table 注释中再次描述相同的架构名称。

Postgres JDBC connections documentation