При автоматической генерации схемы БД на основе классов предметной области спецификация JPA и Hibenate, как её реализация, позволяют очень гибко настраивать имена таблиц, соответствующих сущностям.
Добавьте в файл application.properties тестового проекта следующие строки, чтобы можно было видеть вывод Hibernate’а:
1 2 |
spring.jpa.properties.hibernate.show_sql=true spring.jpa.properties.hibernate.format_sql=true |
Значение по умолчанию
Если никак не управлять именами таблиц, создаваемых в пару к классам предметной области, то имена будут создаваться автоматически, на основании имён классов. При этом кемелкейс имён классов будет преобразован в нижнее подчёркивания имён таблиц.
Например, для такой сущности:
1 2 3 4 5 6 |
@Entity public class FullName { @Id @GeneratedValue Long id; } |
будет создана таблица с именем FULL_NAME. Если чувствительность к регистру специально не настраивалась, то СУБД скорее всего к регистру символов в именах не чувствительна. При этом в PostgreSQL имена будут по умолчанию создаваться в нижнем регистре. Но, тем не менее, говоря об именах таблиц и колонок БД, как правило, их пишут в верхнем регистре. Поэтому, запустив этот код в нашем приложении мы увидим в PostgreSQL, мы увидим full_name.
Произвольное именование таблицы
Если мы попробуем запустить проект с таким классом:
1 2 3 4 5 6 |
@Entity public class User { @Id @GeneratedValue Long id; } |
То во время запуска, в консоли увидим такое сообщение:
1 2 3 4 5 |
GenerationTarget encountered exception accepting command : Error executing DDL " create table user ( id bigint not null, primary key (id) )" via JDBC Statement |
Так как USER является ключевым словом в СУБД PostgreSQL, то нельзя просто так создать таблицу с таким именем.
Чтобы переопределить имя таблицы, соответствующее классу сущности, над классом сущности можно поместить аннотацию @Table с параметром name:
1 2 3 4 5 6 7 |
@Entity @Table(name = "USERS") public class User { @Id @GeneratedValue Long id; } |
После запуска приложения в консоли мы должны увидеть такое сообщение:
1 2 3 4 5 6 7 |
Hibernate: create table users ( id bigint not null, primary key (id) ) Hibernate: create sequence users_seq start with 1 increment by 50 |
И Hibernate создаст следующую таблицу:
Помимо name, в @Table также можно передать параметры catalog и schema:
1 2 3 4 5 6 7 |
@Entity @Table(schema = "public", name = "USERS") public class User { @Id @GeneratedValue Long id; } |
↓
1 2 3 4 5 6 7 |
Hibernate: create table public.users ( id bigint not null, primary key (id) ) Hibernate: create sequence users_seq start with 1 increment by 50 |
Создание таблиц, имена которых совпадают с ключевыми словами СУБД
Если необходимо создать таблицу, имя которой будет совпадать с одним из ключевых слов в СУБД, то имя такой таблицы нужно заключить в кавычки. Причём, поскольку это делается в параметре аннотации, который и так в кавычках, то придётся использовать экранирование:
1 2 3 4 5 6 7 |
@Entity @Table(name = "\"USER\"") public class User { @Id @GeneratedValue Long id; } |
Поскольку, работая с Spring Boot 3 с технологией Spring Data JPA, мы можем быть уверены, что имеплементацией JPA всегда будет Hibernate, то можно использовать и более наглядный синтаксис с обратными кавычками:
1 |
@Table(name = "`USER`") |
Но нужно иметь в виду, что такой вариант работает только с Hibernate и может не работать, с другой имплементацией JPA.
Запустив приложение, мы увидим в логах запуска следующий вывод:
1 2 3 4 |
create table "user" ( id bigint not null, primary key (id) ) |
Теперь при создании запроса к такой таблице нужно знать, как в конкретной СУБД оборачивать имя такой таблицы. Например, в PostgreSQL такое имя заключается в двойные кавычки:
В других СУБД будет по-другому. Например, в MS SQL SERVER это будет [USER], а в MySQL — ‘USER’.