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

11
在Spring Data JPA中,我们可以使用@Table注释将实体映射到特定的表,这里我们可以指定架构和名称。
但是,Spring Data JDBC使用NamingStrategy通过转换实体类名将实体映射到表名。例如,如果我们有一个名为MetricValue的实体类,则默认模式下该表应命名为metricvalue。但我需要将MetricValue映射到app模式下的metric_value表。
是否有任何方法可以通过注释或其他方式覆盖此映射?
3个回答

12

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_entityentity的反向引用列将被命名为entity_id,而不是通常的外键列entity(被引用表的表名)。 列表索引将存储在entity_index中,而不是默认的entity_key
我创建了一个改进文档的问题

很棒,@Table 注解也可行!希望这是一个稳定的功能。 - keddok
1
我不认为它没有理由不去做。它可能会看到一些扩展和改进(例如一个等同于value属性的name属性)。 - Jens Schauder
@JensSchauder 能否将示例作为新答案放置? - Kartoch
1
@Kartoch 不确定为什么我要在另一个答案中放置一个示例,但我已经更新了答案,并演示了使用@Table@Column注释的示例。 - Jens Schauder

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

谢谢 @Kartoch!看来这种方法是有效的,我能够进一步进行。不幸的是,我卡在了另一个问题上,无法验证此解决方案的完整性。我会随时向你更新。 - keddok
1
更新。是的,NamingStrategy bean 做得很好。 - keddok
@keddok,您能否将示例作为一个新的答案发布? - Kartoch
使用 NamingStrategy 配置简单的启动应用程序,为模式推送:https://github.com/keddok/sandbox/tree/master/spring-data-jdbc - keddok

-4
使用@Table(name = "metric_value")

这不是JPA,也不是spring-data-jpa - Kartoch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接