【发布时间】:2019-09-04 08:25:45
【问题描述】:
我的 Spring 应用程序必须从一个名为 MY_DOMAIN_OBJECT 的表中读取,该表属于 MY_CUSTOM_SCHEMA 模式,请注意默认模式中也存在同一个表。
我正在使用 spring-data-jdbc 但我无法从正确的架构中读取。
我正在创建一个自定义 NamingStrategy bean,其中包含一些方法覆盖但没有成功,结果是我从默认模式中的表中获取结果。
知道我在这里做错了什么吗?
在相关类下面:
AppConfig.java
@Configuration
@EnableJdbcRepositories(basePackages = "my.package.for.persistence")
public class AppConfig extends JdbcConfiguration {
@Bean(name = "sourceDS", destroyMethod = "")
public DataSource sourceDatasource() {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
return dataSourceLookup.getDataSource("jdbc/OracleDS");
}
@Bean
public NamedParameterJdbcOperations operations() {
return new NamedParameterJdbcTemplate(sourceDatasource());
}
@Bean
//@Primary
public NamingStrategy namingStrategy() {
return new NamingStrategy() {
@Override
public String getTableName(Class<?> type) {
return type.isAnnotationPresent(Table.class) ?
type.getAnnotation(Table.class).value() : NamingStrategy.super.getTableName(type);
}
@Override
public String getQualifiedTableName(Class<?> type) {
return type.isAnnotationPresent(Table.class) ?
type.getAnnotation(Table.class).value() : NamingStrategy.super.getTableName(type);
}
@Override
public String getSchema() {
return "my_custom_schema";
}
};
}
}
MyDomainObject.java
package my.package.for.persistence;
@Data
@AllArgsConstructor
@Table("MY_DOMAIN_OBJECT")
public class MyDomainObject{
@Id
private Long id;
//other fields
}
MyRepository.java
package my.package.for.persistence;
public interface MyRepository extends Repository<MyDomainObject, Long> {
Stream<MyDomainObject> findAll();
}
更新:我忘了提到我正在使用spring-boot-starter-data-jdbc,我怀疑这是导致问题的原因。
【问题讨论】:
-
您使用的是哪个版本? 1.0.x 还是 1.1.x?我强烈推荐后者,即将发布 GA 版本。它还将
JdbcConfiguration替换为AbstractJdbcConfiguration。如果问题仍然存在,那么 github 存储库可以很好地重现该问题。spring-boot-starter-data-jdbc可以很好地配置NamingStrategy。我昨天在一个研讨会上就是这样做的。 -
使用
1.1.0.M2版本(因此没有spring-boot-starter-data-jdbc依赖项)和AbstractJdbcConfiguration应用程序在启动时使用the bean 'jdbcMappingContext', defined in class path resource [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [it/vortex/spring/jdbc/configuration/AppConfig.class] and overriding is disabled失败。我没有在我的自定义配置类中定义任何该类型的 bean。 -
@JensSchauder 您是否尝试过覆盖
NamingStrategy中的架构? -
不,我没有。你有我可以看看的 github 存储库吗?
-
github.com/vortexalex/tutorials.git,项目是spring-boot-data-jdbc。我使用了 H2 数据库,因此您只需构建并运行它。我可以说的是自定义的
NamingStrategybean 被使用(你可以将固定的表名更改为另一个随机来检查),但getSchema方法似乎没有被调用。
标签: spring spring-boot spring-data-jdbc