Как отобразить сущность в таблицу в Spring Data JDBC? - PullRequest
0 голосов
/ 30 октября 2018

В Spring Data JPA мы можем сопоставить сущность с определенной таблицей, используя аннотацию @Table, где мы можем указать схему и имя.

Но Spring Data JDBC использует NamingStrategy для сопоставления сущности с именем таблицы путем преобразования имени класса сущностей. Например, если у нас есть класс сущности с именем MetricValue, тогда таблица должна иметь имя metricvalue в схеме по умолчанию. Но мне нужно сопоставить MetricValue с таблицей metric_value в схеме app.

Есть ли способ переопределить это отображение с помощью аннотации или любого другого?

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Использование @Table(name = "metric_value").

0 голосов
/ 31 октября 2018

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_entity до entity будут именоваться entity_id для столбца внешнего ключа, который обычно будет entity (имя таблицы ссылочной таблицы). И индекс списка будет храниться в entity_index вместо значения по умолчанию entity_key.

Я создал проблему для улучшения документации .

0 голосов
/ 30 октября 2018

Поведение именования определяется реализацией интерфейса по умолчанию NamingStrategy

Из справочной документации, раздел 4.4.3 версии 1.0.2 :

Когда вы используете стандартные реализации CrudRepository, Spring Data JDBC обеспечивает, они ожидают определенной структуры таблицы. Вы можете настроить это, предоставление NamingStrategy в контексте вашего приложения.

Реализация по умолчанию имеет следующее поведение (из версии 1.0.2 javadoc) :

По умолчанию отсутствует схема, имя таблицы на основе класса и имя столбца на основе RelationalPersistentProperty с именными частями обоих, разделенных '_'.

Итак, создайте bean-компонент, который реализует NamingStrategy, чтобы зарегистрировать его в контексте вашего приложения.

Это пример из комментария @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";
            }
        };
    }
}
...