无法让自定义 NamingStrategy 工作
unable to get custom NamingStrategy working
我的 Spring 应用程序必须从属于 MY_CUSTOM_SCHEMA 架构的名为 MY_DOMAIN_OBJECT 的 table 中读取,请注意相同的 table 存在于默认模式也是如此。
我正在使用 spring-data-jdbc 但我无法从正确的架构中读取数据。
我正在创建一个带有某些方法覆盖的自定义 NamingStrategy
bean 但没有成功,结果是我从默认模式中的 table 获得结果。
知道我做错了什么吗?
以下相关类:
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
,我怀疑这是导致问题的原因。
哦抱歉,我应该早点看到的。
不要覆盖 getQualifiedTableName
默认实现会合并 table 和架构名称。
我的 Spring 应用程序必须从属于 MY_CUSTOM_SCHEMA 架构的名为 MY_DOMAIN_OBJECT 的 table 中读取,请注意相同的 table 存在于默认模式也是如此。
我正在使用 spring-data-jdbc 但我无法从正确的架构中读取数据。
我正在创建一个带有某些方法覆盖的自定义 NamingStrategy
bean 但没有成功,结果是我从默认模式中的 table 获得结果。
知道我做错了什么吗?
以下相关类:
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
,我怀疑这是导致问题的原因。
哦抱歉,我应该早点看到的。
不要覆盖 getQualifiedTableName
默认实现会合并 table 和架构名称。