Настройка имён таблиц с помощью аннотации @Table в Hibernate

При автоматической генерации схемы БД на основе классов предметной области спецификация JPA и Hibenate, как её реализация, позволяют очень гибко настраивать имена таблиц, соответствующих сущностям.

Добавьте в файл application.properties тестового проекта следующие строки, чтобы можно было видеть вывод Hibernate’а:

Значение по умолчанию

Если никак не управлять именами таблиц, создаваемых в пару к классам предметной области, то имена будут создаваться автоматически, на основании имён классов. При этом кемелкейс имён классов будет преобразован в нижнее подчёркивания имён таблиц.

Например, для такой сущности:

будет создана таблица с именем FULL_NAME. Если чувствительность к регистру специально не настраивалась, то СУБД скорее всего к регистру символов в именах не чувствительна. При этом в PostgreSQL имена будут по умолчанию создаваться в нижнем регистре. Но, тем не менее, говоря об именах таблиц и колонок БД, как правило, их пишут в верхнем регистре. Поэтому, запустив этот код в нашем приложении мы увидим в PostgreSQL, мы увидим full_name.

Произвольное именование таблицы

Если мы попробуем запустить проект с таким классом:

То во время запуска, в консоли увидим такое сообщение:

Так как USER является ключевым словом в СУБД PostgreSQL, то нельзя просто так создать таблицу с таким именем.

Чтобы переопределить имя таблицы, соответствующее классу сущности, над классом сущности можно поместить аннотацию @Table с параметром name:

После запуска приложения в консоли мы должны увидеть такое сообщение:

И Hibernate создаст следующую таблицу:

Помимо name, в @Table также можно передать параметры catalog и schema:

Создание таблиц, имена которых совпадают с ключевыми словами СУБД

Если необходимо создать таблицу, имя которой будет совпадать с одним из ключевых слов в СУБД, то имя такой таблицы нужно заключить в кавычки. Причём, поскольку это делается в параметре аннотации, который и так в кавычках, то придётся использовать экранирование:

Поскольку, работая с Spring Boot 3 с технологией Spring Data JPA, мы можем быть уверены, что имеплементацией JPA всегда будет Hibernate, то можно использовать и более наглядный синтаксис с обратными кавычками:

Но нужно иметь в виду, что такой вариант работает только с Hibernate и может не работать, с другой имплементацией JPA.

Запустив приложение, мы увидим в логах запуска следующий вывод:

Теперь при создании запроса к такой таблице нужно знать, как в конкретной СУБД оборачивать имя такой таблицы. Например, в PostgreSQL такое имя заключается в двойные кавычки:

В других СУБД будет по-другому. Например, в MS SQL SERVER это будет [USER], а в MySQL — ‘USER’.