Автор оригинала: François Dupire.
1. Введение
Spring Data JPA предлагает множество функций для использования JPA в приложении. Среди этих функций есть стандартизация имен таблиц и столбцев как в запросах DDL, так и в DML.
В этом коротком учебнике мы увидим, как настроить эту конвенцию именования по умолчанию.
2. Конвенция о наименовании по умолчанию
Прежде всего, давайте посмотрим, что Весна по умолчанию именования конвенции в отношении таблицы и названия столбца.
Давайте представим, что у нас есть Лицо сущность:
@Entity public class Person { @Id private Long id; private String firstName; private String lastName; }
У нас есть несколько имен, которые должны быть отображены в базу данных. Ну, Весна использует нижнюю змею случае по умолчанию , что означает, что он использует только нижние буквы случае и отделяет слова с подчеркивает. Таким образом, запрос на создание таблицы для Лицо сущность будет:
create table person (id bigint not null, first_name varchar(255), last_name varchar(255), primary key (id));
И выбор запроса, возвращающего все имена, будет:
select first_name from person;
Чтобы сделать это, Весна реализовала свою версию Зимовая физическаяnamingStrategy : ВеснаФизическаяНаэмингСтратегия .
3. RdMS Дело-Чувствительность
Прежде чем вдаваться в подробности о том, как создать наш пользовательский именования конвенции, давайте поговорим немного о том, как RDMS управляет случае идентификаторов.
Есть два сценария, чтобы рассмотреть: RDMS является чувствительным к делу, или это не так.
В первой ситуации, RDMS будет строго соответствовать идентификаторы, которые имеют тот же случай . Поэтому в нашем примере будет работать следующий запрос:
select first_name from person;
Хотя это один будет бросать ошибки и даже не вернуть результат:
select FIRST_NAME from PERSON;
С другой стороны, для RDMS, который является нечувствительным к делу, оба запроса сработали бы.
Что бы мы сделали, чтобы заставить RDMS, чтобы соответствовать идентификаторы в отношении их дела, Мы можем использовать цитируемые идентификаторы (например, “лицо”).
Используя кавычки вокруг наших идентификаторов, мы говорим базе данных, что она также должна соответствовать примеру при сравнении этих идентификаторов с именами таблиц и столбцев. Таким образом, по-прежнему используя наш пример, следующий запрос будет работать:
select "first_name" from "person";
Хотя этот не будет:
select "first_name" from "PERSON";
Это в теории, хотя, потому что каждый RDMS управляет цитируемых идентификаторов по-своему, так что пробег варьируется .
4. Конвенция о таможенном наименовании
Теперь давайте реализуем нашу собственную конвенцию по именованию.
Представьте, что мы не можем использовать стратегию весеннего нижнего змеиного случая, но нам нужно использовать верхнюю змею. Тогда нам нужно будет обеспечить реализацию PhysicalNamingStrategy .
По мере того как мы идем держать к случае змеи, самый быстрый вариант унаследовать от ВеснаФизическаяНаэмингСтратегия и поверните идентификаторы в верхний корпус:
public class UpperCaseNamingStrategy extends SpringPhysicalNamingStrategy { @Override protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) { return new Identifier(name.toUpperCase(), quoted); } }
Мы просто переопределяем getIdentifier () метод, который отвечает за превращение идентификаторов в нижний случай в супер-классе. Здесь мы используем его, чтобы преобразовать их в верхний корпус.
Как только мы написаем нашу реализацию, мы должны зарегистрировать ее так, чтобы Hibernate знал, чтобы использовать ее. Используя Весну, это делается установка spring.jpa.hibernate.naming.physical-strategy имущественные в нашем application.properts :
spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.UpperCaseNamingStrategy
Теперь наши запросы используют идентификаторы верхних случаев:
create table PERSON (ID bigint not null, FIRST_NAME varchar(255), LAST_NAME varchar(255), primary key (ID)); select FIRST_NAME from PERSON;
Допустим, мы хотим использовать цитируемые идентификаторы, чтобы RDMS был вынужден соответствовать делу. Тогда нам придется использовать истинное в качестве цитирует аргумент Идентификатор () конструктор :
@Override protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) { return new Identifier(name.toUpperCase(), true); }
После того, что наши запросы будут представлять цитируемые идентификаторы:
create table "PERSON" ("ID" bigint not null, "FIRST_NAME" varchar(255), "LAST_NAME" varchar(255), primary key ("ID")); select "FIRST_NAME" from "PERSON";
5. Заключение
В этой короткой статье мы говорили о возможностях внедрения пользовательской стратегии именования с использованием Spring Data JPA и о том, как RDMS будет обрабатывать наши DDL и DML заявления относительно его внутренней конфигурации.
Как обычно, полный код этой статьи можно найти более на GitHub .