问题描述
在我的项目中,我使用的是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
注释中再次描述相同的架构名称。