如何在spring数据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.事实证明,我们正试图在表"中插入一个条目;op_organization;而不在模式alpha中的表op_organization中。

我尝试自定义NamingStrategy以返回模式alpha,但没有成功。

@Configuration
public class AppConfig extends AbstractJdbcConfiguration {
@Bean
public NamingStrategy namingStrategy() {
return new NamingStrategy() {
@Override
public String getSchema() {
return "alpha";
}
};
}
}

有没有办法在springdatajdbc中指定表模式?

如果您正在使用

import org.springframework.data.relational.core.mapping.Table;

春季试建查询

INSERT INTO;op_organization;("名称"(值(?(

但我们需要

INSERT INTO;α"op_organization";("名称"(值(?(

try:

@Table(value = "alpha"."op_organization")

目前的方法是定义一个NamingStrategy。此集成测试的示例:

@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;
}

实体注释如下:@表("用户"(正确映射到服务。用户

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

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

这使我在不同的表名称方面更加灵活,但不需要在@Table注释中再次描述相同的模式名称。

Postgres JDBC连接文档

很抱歉迟到了,但我认为我可以在这里帮助其他开发人员。正如@MadMax所提到的,指定NamingStrategy#getSchema()实际上并不适用于@Table。事实上,存在漏洞,并且在spring数据jdbc中有报告,这实际上告诉指定CCD_ 8与CCD_。

好消息是,为了解决这个问题,在springdatajdbc中打开了一个PullRequest。此Pull Request引入的更改将向@Table注释添加schema参数,如果您愿意,这将允许您显式指定每个表的架构。此外,此PR将消除此错误。

你现在能做什么:好吧,如果你很不幸,需要将@Table#valueNamingStrategy#getSchema()结合使用,那就行不通了。如果您真的需要指定模式,那么现在需要去掉@Table注释。如果您这样做,NamingStrategy的架构将正确应用。

可以直接在DataSource:中覆盖模式

@Configuration
public class DatabaseConfig {
@Autowired
public void configureDataSource(HikariDataSource dataSource) {
dataSource.setSchema("SCHEMA_NAME");
}
}

或在application.yml中简单指定

spring:
datasource:
hikari:
schema: 'SCHEMA_NAME'

最新更新