How to map entity to table in Spring Data JDBC?
up vote
5
down vote
favorite
In Spring Data JPA we can map an entity to a specific table by using @Table annotation where we can specify schema and name.
But Spring Data JDBC uses a NamingStrategy to map an entity to a table name by converting the entities class name. For example, if we have the entity class named MetricValue then the table should be named metricvalue in default schema. But I need to map MetricValue to the metric_value table in app schema.
Is there any way to override this mapping by annotation or any other?
java spring spring-data mapping spring-data-jdbc
add a comment |
up vote
5
down vote
favorite
In Spring Data JPA we can map an entity to a specific table by using @Table annotation where we can specify schema and name.
But Spring Data JDBC uses a NamingStrategy to map an entity to a table name by converting the entities class name. For example, if we have the entity class named MetricValue then the table should be named metricvalue in default schema. But I need to map MetricValue to the metric_value table in app schema.
Is there any way to override this mapping by annotation or any other?
java spring spring-data mapping spring-data-jdbc
add a comment |
up vote
5
down vote
favorite
up vote
5
down vote
favorite
In Spring Data JPA we can map an entity to a specific table by using @Table annotation where we can specify schema and name.
But Spring Data JDBC uses a NamingStrategy to map an entity to a table name by converting the entities class name. For example, if we have the entity class named MetricValue then the table should be named metricvalue in default schema. But I need to map MetricValue to the metric_value table in app schema.
Is there any way to override this mapping by annotation or any other?
java spring spring-data mapping spring-data-jdbc
In Spring Data JPA we can map an entity to a specific table by using @Table annotation where we can specify schema and name.
But Spring Data JDBC uses a NamingStrategy to map an entity to a table name by converting the entities class name. For example, if we have the entity class named MetricValue then the table should be named metricvalue in default schema. But I need to map MetricValue to the metric_value table in app schema.
Is there any way to override this mapping by annotation or any other?
java spring spring-data mapping spring-data-jdbc
java spring spring-data mapping spring-data-jdbc
edited Oct 31 at 9:15
Jens Schauder
45.3k16112234
45.3k16112234
asked Oct 30 at 11:25
keddok
446
446
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
up vote
3
down vote
accepted
The naming behavior is defined by the default implementation of the interface NamingStrategy
From 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 default implementation has 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 '_'.
So create a bean which implements NamingStrategy in register it in your application context.
This is an example from @keddok comment:
@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";
}
};
}
}
Thanx, @Kartoch! Seems this approach is valid and i was able to go further. Unfortunately i stuck into other problem and can't verify completness of this solution. I'll keep you up to date.
– keddok
Oct 30 at 14:07
1
UPDATE. Yes,NamingStrategybean did his job well.
– keddok
Oct 31 at 8:44
@keddok could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:26
pushed a simple boot application usingNamingStrategyconfiguration for schema: github.com/keddok/sandbox/tree/master/spring-data-jdbc
– keddok
Nov 9 at 7:45
I've updated the answer with your example
– Kartoch
Nov 11 at 15:46
add a comment |
up vote
2
down vote
Spring Data JDBC has it's own @Table annotation and also an @Column one.
You just add the annotation to your entity and specify the name as the value of the annotation.
To give some examples:
@Table("entity")
class MyEntity {
private @Column("last_name") String name;
@Column(value = "entity_id", keyColumn = "entity_index")
private List<SomeOtherEntity> someList;
}
This will read and write MyEntity into/from the table entity instead of the default my_entity.
The attribute name will get stored in the column last_name.
And the columns for backreferencing from the some_other_entity to entity will be named entity_id for the foreign key column which normally would be entity (the table name of the referenced table).
And the list index will be stored in entity_index instead of the default entity_key.
I created an issue for improving the documentation.
Nice,@Tableannotation works too! Hope this is a stable feature.
– keddok
Oct 31 at 8:39
1
I don't see a reason why it shouldn't. It will probably see some extension and improvement (like anameattribute equivalent to thevalueattribute).
– Jens Schauder
Oct 31 at 9:12
@JensSchauder Could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:25
1
@Kartoch Not sure, why I'd put an example in a separate answer, but I updated the answer with an example demonstrating the use of the@Tableand@Columnannotation.
– Jens Schauder
Nov 7 at 8:52
add a comment |
up vote
-4
down vote
Use @Table(name = "metric_value").
It's not JPA neitherspring-data-jpa.
– Kartoch
Oct 30 at 11:47
add a comment |
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
3
down vote
accepted
The naming behavior is defined by the default implementation of the interface NamingStrategy
From 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 default implementation has 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 '_'.
So create a bean which implements NamingStrategy in register it in your application context.
This is an example from @keddok comment:
@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";
}
};
}
}
Thanx, @Kartoch! Seems this approach is valid and i was able to go further. Unfortunately i stuck into other problem and can't verify completness of this solution. I'll keep you up to date.
– keddok
Oct 30 at 14:07
1
UPDATE. Yes,NamingStrategybean did his job well.
– keddok
Oct 31 at 8:44
@keddok could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:26
pushed a simple boot application usingNamingStrategyconfiguration for schema: github.com/keddok/sandbox/tree/master/spring-data-jdbc
– keddok
Nov 9 at 7:45
I've updated the answer with your example
– Kartoch
Nov 11 at 15:46
add a comment |
up vote
3
down vote
accepted
The naming behavior is defined by the default implementation of the interface NamingStrategy
From 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 default implementation has 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 '_'.
So create a bean which implements NamingStrategy in register it in your application context.
This is an example from @keddok comment:
@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";
}
};
}
}
Thanx, @Kartoch! Seems this approach is valid and i was able to go further. Unfortunately i stuck into other problem and can't verify completness of this solution. I'll keep you up to date.
– keddok
Oct 30 at 14:07
1
UPDATE. Yes,NamingStrategybean did his job well.
– keddok
Oct 31 at 8:44
@keddok could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:26
pushed a simple boot application usingNamingStrategyconfiguration for schema: github.com/keddok/sandbox/tree/master/spring-data-jdbc
– keddok
Nov 9 at 7:45
I've updated the answer with your example
– Kartoch
Nov 11 at 15:46
add a comment |
up vote
3
down vote
accepted
up vote
3
down vote
accepted
The naming behavior is defined by the default implementation of the interface NamingStrategy
From 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 default implementation has 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 '_'.
So create a bean which implements NamingStrategy in register it in your application context.
This is an example from @keddok comment:
@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";
}
};
}
}
The naming behavior is defined by the default implementation of the interface NamingStrategy
From 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 default implementation has 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 '_'.
So create a bean which implements NamingStrategy in register it in your application context.
This is an example from @keddok comment:
@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";
}
};
}
}
edited Nov 11 at 15:47
answered Oct 30 at 11:34
Kartoch
3,82193259
3,82193259
Thanx, @Kartoch! Seems this approach is valid and i was able to go further. Unfortunately i stuck into other problem and can't verify completness of this solution. I'll keep you up to date.
– keddok
Oct 30 at 14:07
1
UPDATE. Yes,NamingStrategybean did his job well.
– keddok
Oct 31 at 8:44
@keddok could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:26
pushed a simple boot application usingNamingStrategyconfiguration for schema: github.com/keddok/sandbox/tree/master/spring-data-jdbc
– keddok
Nov 9 at 7:45
I've updated the answer with your example
– Kartoch
Nov 11 at 15:46
add a comment |
Thanx, @Kartoch! Seems this approach is valid and i was able to go further. Unfortunately i stuck into other problem and can't verify completness of this solution. I'll keep you up to date.
– keddok
Oct 30 at 14:07
1
UPDATE. Yes,NamingStrategybean did his job well.
– keddok
Oct 31 at 8:44
@keddok could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:26
pushed a simple boot application usingNamingStrategyconfiguration for schema: github.com/keddok/sandbox/tree/master/spring-data-jdbc
– keddok
Nov 9 at 7:45
I've updated the answer with your example
– Kartoch
Nov 11 at 15:46
Thanx, @Kartoch! Seems this approach is valid and i was able to go further. Unfortunately i stuck into other problem and can't verify completness of this solution. I'll keep you up to date.
– keddok
Oct 30 at 14:07
Thanx, @Kartoch! Seems this approach is valid and i was able to go further. Unfortunately i stuck into other problem and can't verify completness of this solution. I'll keep you up to date.
– keddok
Oct 30 at 14:07
1
1
UPDATE. Yes,
NamingStrategy bean did his job well.– keddok
Oct 31 at 8:44
UPDATE. Yes,
NamingStrategy bean did his job well.– keddok
Oct 31 at 8:44
@keddok could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:26
@keddok could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:26
pushed a simple boot application using
NamingStrategy configuration for schema: github.com/keddok/sandbox/tree/master/spring-data-jdbc– keddok
Nov 9 at 7:45
pushed a simple boot application using
NamingStrategy configuration for schema: github.com/keddok/sandbox/tree/master/spring-data-jdbc– keddok
Nov 9 at 7:45
I've updated the answer with your example
– Kartoch
Nov 11 at 15:46
I've updated the answer with your example
– Kartoch
Nov 11 at 15:46
add a comment |
up vote
2
down vote
Spring Data JDBC has it's own @Table annotation and also an @Column one.
You just add the annotation to your entity and specify the name as the value of the annotation.
To give some examples:
@Table("entity")
class MyEntity {
private @Column("last_name") String name;
@Column(value = "entity_id", keyColumn = "entity_index")
private List<SomeOtherEntity> someList;
}
This will read and write MyEntity into/from the table entity instead of the default my_entity.
The attribute name will get stored in the column last_name.
And the columns for backreferencing from the some_other_entity to entity will be named entity_id for the foreign key column which normally would be entity (the table name of the referenced table).
And the list index will be stored in entity_index instead of the default entity_key.
I created an issue for improving the documentation.
Nice,@Tableannotation works too! Hope this is a stable feature.
– keddok
Oct 31 at 8:39
1
I don't see a reason why it shouldn't. It will probably see some extension and improvement (like anameattribute equivalent to thevalueattribute).
– Jens Schauder
Oct 31 at 9:12
@JensSchauder Could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:25
1
@Kartoch Not sure, why I'd put an example in a separate answer, but I updated the answer with an example demonstrating the use of the@Tableand@Columnannotation.
– Jens Schauder
Nov 7 at 8:52
add a comment |
up vote
2
down vote
Spring Data JDBC has it's own @Table annotation and also an @Column one.
You just add the annotation to your entity and specify the name as the value of the annotation.
To give some examples:
@Table("entity")
class MyEntity {
private @Column("last_name") String name;
@Column(value = "entity_id", keyColumn = "entity_index")
private List<SomeOtherEntity> someList;
}
This will read and write MyEntity into/from the table entity instead of the default my_entity.
The attribute name will get stored in the column last_name.
And the columns for backreferencing from the some_other_entity to entity will be named entity_id for the foreign key column which normally would be entity (the table name of the referenced table).
And the list index will be stored in entity_index instead of the default entity_key.
I created an issue for improving the documentation.
Nice,@Tableannotation works too! Hope this is a stable feature.
– keddok
Oct 31 at 8:39
1
I don't see a reason why it shouldn't. It will probably see some extension and improvement (like anameattribute equivalent to thevalueattribute).
– Jens Schauder
Oct 31 at 9:12
@JensSchauder Could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:25
1
@Kartoch Not sure, why I'd put an example in a separate answer, but I updated the answer with an example demonstrating the use of the@Tableand@Columnannotation.
– Jens Schauder
Nov 7 at 8:52
add a comment |
up vote
2
down vote
up vote
2
down vote
Spring Data JDBC has it's own @Table annotation and also an @Column one.
You just add the annotation to your entity and specify the name as the value of the annotation.
To give some examples:
@Table("entity")
class MyEntity {
private @Column("last_name") String name;
@Column(value = "entity_id", keyColumn = "entity_index")
private List<SomeOtherEntity> someList;
}
This will read and write MyEntity into/from the table entity instead of the default my_entity.
The attribute name will get stored in the column last_name.
And the columns for backreferencing from the some_other_entity to entity will be named entity_id for the foreign key column which normally would be entity (the table name of the referenced table).
And the list index will be stored in entity_index instead of the default entity_key.
I created an issue for improving the documentation.
Spring Data JDBC has it's own @Table annotation and also an @Column one.
You just add the annotation to your entity and specify the name as the value of the annotation.
To give some examples:
@Table("entity")
class MyEntity {
private @Column("last_name") String name;
@Column(value = "entity_id", keyColumn = "entity_index")
private List<SomeOtherEntity> someList;
}
This will read and write MyEntity into/from the table entity instead of the default my_entity.
The attribute name will get stored in the column last_name.
And the columns for backreferencing from the some_other_entity to entity will be named entity_id for the foreign key column which normally would be entity (the table name of the referenced table).
And the list index will be stored in entity_index instead of the default entity_key.
I created an issue for improving the documentation.
edited Nov 7 at 8:50
answered Oct 31 at 6:16
Jens Schauder
45.3k16112234
45.3k16112234
Nice,@Tableannotation works too! Hope this is a stable feature.
– keddok
Oct 31 at 8:39
1
I don't see a reason why it shouldn't. It will probably see some extension and improvement (like anameattribute equivalent to thevalueattribute).
– Jens Schauder
Oct 31 at 9:12
@JensSchauder Could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:25
1
@Kartoch Not sure, why I'd put an example in a separate answer, but I updated the answer with an example demonstrating the use of the@Tableand@Columnannotation.
– Jens Schauder
Nov 7 at 8:52
add a comment |
Nice,@Tableannotation works too! Hope this is a stable feature.
– keddok
Oct 31 at 8:39
1
I don't see a reason why it shouldn't. It will probably see some extension and improvement (like anameattribute equivalent to thevalueattribute).
– Jens Schauder
Oct 31 at 9:12
@JensSchauder Could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:25
1
@Kartoch Not sure, why I'd put an example in a separate answer, but I updated the answer with an example demonstrating the use of the@Tableand@Columnannotation.
– Jens Schauder
Nov 7 at 8:52
Nice,
@Table annotation works too! Hope this is a stable feature.– keddok
Oct 31 at 8:39
Nice,
@Table annotation works too! Hope this is a stable feature.– keddok
Oct 31 at 8:39
1
1
I don't see a reason why it shouldn't. It will probably see some extension and improvement (like a
name attribute equivalent to the value attribute).– Jens Schauder
Oct 31 at 9:12
I don't see a reason why it shouldn't. It will probably see some extension and improvement (like a
name attribute equivalent to the value attribute).– Jens Schauder
Oct 31 at 9:12
@JensSchauder Could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:25
@JensSchauder Could you put an example as a new answer ?
– Kartoch
Nov 7 at 8:25
1
1
@Kartoch Not sure, why I'd put an example in a separate answer, but I updated the answer with an example demonstrating the use of the
@Table and @Column annotation.– Jens Schauder
Nov 7 at 8:52
@Kartoch Not sure, why I'd put an example in a separate answer, but I updated the answer with an example demonstrating the use of the
@Table and @Column annotation.– Jens Schauder
Nov 7 at 8:52
add a comment |
up vote
-4
down vote
Use @Table(name = "metric_value").
It's not JPA neitherspring-data-jpa.
– Kartoch
Oct 30 at 11:47
add a comment |
up vote
-4
down vote
Use @Table(name = "metric_value").
It's not JPA neitherspring-data-jpa.
– Kartoch
Oct 30 at 11:47
add a comment |
up vote
-4
down vote
up vote
-4
down vote
Use @Table(name = "metric_value").
Use @Table(name = "metric_value").
edited Oct 30 at 11:45
Sai prateek
4,17962851
4,17962851
answered Oct 30 at 11:42
Ashoka
12
12
It's not JPA neitherspring-data-jpa.
– Kartoch
Oct 30 at 11:47
add a comment |
It's not JPA neitherspring-data-jpa.
– Kartoch
Oct 30 at 11:47
It's not JPA neither
spring-data-jpa.– Kartoch
Oct 30 at 11:47
It's not JPA neither
spring-data-jpa.– Kartoch
Oct 30 at 11:47
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53063266%2fhow-to-map-entity-to-table-in-spring-data-jdbc%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown