How to map entity to table in Spring Data JDBC? How to map entity to table in Spring Data JDBC? spring spring

How to map entity to table in Spring Data JDBC?


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.


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