在我的项目中,我使用的是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#value
与NamingStrategy#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'