如何将实体映射到 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_entity
到 entity
的反向引用列将被命名为 entity_id
作为外键列,通常是 entity
(table 的名称参考 table)。
列表索引将存储在 entity_index
而不是默认的 entity_key
.
在 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_entity
到 entity
的反向引用列将被命名为 entity_id
作为外键列,通常是 entity
(table 的名称参考 table)。
列表索引将存储在 entity_index
而不是默认的 entity_key
.