【问题标题】:unable to get custom NamingStrategy working无法让自定义 NamingStrategy 工作
【发布时间】: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 数据库,因此您只需构建并运行它。我可以说的是自定义的NamingStrategy bean 被使用(你可以将固定的表名更改为另一个随机来检查),但getSchema 方法似乎没有被调用。

标签: spring spring-boot spring-data-jdbc


【解决方案1】:

哦,抱歉,我应该早点看到的。

不要覆盖getQualifiedTableName,默认实现会合并表和架构名称。

【讨论】:

  • 谢谢,我把它放在这里只是为了完整:default String getQualifiedTableName(Class&lt;?&gt; type) { return this.getSchema() + (this.getSchema().equals("") ? "" : ".") + this.getTableName(type); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
相关资源
最近更新 更多