如何在Spring Data JDBC中将实体映射到表?

ked*_*dok 6 java mapping spring spring-data spring-data-jdbc

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

但Spring Data JDBC使用a NamingStrategy通过转换实体类名将实体映射到表名.例如,如果我们有实体类命名,MetricValue那么表应该metricvalue在默认模式中命名.但我需要映射MetricValue到架构中的metric_valueapp.

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

Kar*_*och 5

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

来自参考文档,版本 1.0.2 的第 4.4.3 节

当您使用 Spring Data JDBC 提供的 CrudRepository 标准实现时,它们需要特定的表结构。您可以通过在应用程序上下文中提供 NamingStrategy 来调整它。

默认实现具有以下行为(来自 javadoc 版本 1.0.2)

默认为无模式,表名基于 Class,列名基于 RelationalPersistentProperty,两者的名称部分均以“_”分隔。

因此,创建一个 bean,并NamingStrategy在应用程序上下文中注册它。

这是来自 @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";
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)


Jen*_*der 5

Spring Data JDBC有自己的@Table注释,也有@Column一个注释.

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

举一些例子:

@Table("entity") 
class MyEntity {

    private @Column("last_name") String name;

    @Column(value = "entity_id", keyColumn = "entity_index") 
    private List<SomeOtherEntity> someList;
}
Run Code Online (Sandbox Code Playgroud)

这将读取和写入MyEntityentity而不是默认值my_entity.该属性name将存储在列中last_name.而来自some_other_entityto的反向引用列entityentity_id以外键列entity的名称命名(通常为引用表的表名).列表索引将存储entity_index而不是默认值entity_key.

我创建了一个改进文档的问题.