10

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

但是 Spring Data JDBC 使用 aNamingStrategy通过转换实体类名来将实体映射到表名。例如,如果我们命名了实体类,MetricValue那么表应该以metricvalue默认模式命名。但我需要映射MetricValue到模式中的metric_valueapp

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

4

3 回答 3

8

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;
}

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

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

于 2018-10-31T06:16:21.203 回答
5

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

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

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

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

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

因此,创建一个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";
            }
        };
    }
}
于 2018-10-30T11:34:21.123 回答
-4

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

于 2018-10-30T11:42:34.567 回答