如何将实体映射到 Spring 数据 JDBC 中的 table?

How to map entity to table in Spring Data JDBC?

在 Spring Data JPA 中,我们可以使用 @Table 注释将实体映射到特定的 table,我们可以在其中指定模式和名称。

但是 Spring 数据 JDBC 使用 NamingStrategy 通过转换实体 class 名称将实体映射到 table 名称。例如,如果我们将实体 class 命名为 MetricValue,则 table 在默认架构中应命名为 metricvalue。但我需要将 MetricValue 映射到 app 模式中的 metric_value table。

有没有办法通过注释或任何其他方法覆盖此映射?

命名行为由接口的默认实现定义NamingStrategy

来自reference documentation, section 4.4.3 of version 1.0.2

When you use the standard implementations of CrudRepository that Spring Data JDBC provides, they expect a certain table structure. You can tweak that by providing a NamingStrategy in your application context.

默认实现有the following behavior (from javadoc version 1.0.2):

Defaults to no schema, table name based on Class and column name based on RelationalPersistentProperty with name parts of both separated by '_'.

因此创建一个实现 NamingStrategy 的 bean,将其注册到您的应用程序上下文中。

这是来自@keddok 评论的例子:

@Configuration
@EnableJdbcRepositories
public class MetricStoreRepositoryConfig extends JdbcConfiguration {
    @Autowired
    private DataSource dataSource;

    @Bean
    NamedParameterJdbcOperations operations() {
        return new NamedParameterJdbcTemplate(dataSource);
    }

    @Bean
    PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    NamingStrategy namingStrategy() {
        return new NamingStrategy() {
            @Override
            public String getSchema() {
                return "metric";
            }
        };
    }
}

使用@Table(name = "metric_value").

Spring Data JDBC has it's own @Table annotation and also an @Column一个.

您只需将注释添加到您的实体并将名称指定为注释的值。

举几个例子:

@Table("entity") 
class MyEntity {

    private @Column("last_name") String name;

    @Column(value = "entity_id", keyColumn = "entity_index") 
    private List<SomeOtherEntity> someList;
}

这将读取和写入 MyEntity into/from table entity 而不是默认的 my_entity。 属性 name 将存储在列 last_name 中。 从 some_other_entityentity 的反向引用列将被命名为 entity_id 作为外键列,通常是 entity (table 的名称参考 table)。 列表索引将存储在 entity_index 而不是默认的 entity_key.

我创建了 an issue for improving the documentation