Перейти к основному содержимому

Конфигурация стратегии именования Hibernate 5

· 5 мин. чтения

1. Обзор

Hibernate 5 предоставляет две разные стратегии именования для использования с сущностями Hibernate: стратегию неявного именования и стратегию физического именования.

В этом руководстве мы увидим, как настроить эти стратегии именования для сопоставления сущностей с настраиваемыми именами таблиц и столбцов.

Для читателей, которые плохо знакомы с Hibernate, обязательно ознакомьтесь с нашей вводной статьей здесь .

2. Зависимости

В этом руководстве мы будем использовать базовую зависимость Hibernate Core :

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.6.Final</version>
</dependency>

3. Стратегия неявного именования

Hibernate использует логическое имя для сопоставления имени сущности или атрибута с именем таблицы или столбца. Это имя можно настроить двумя способами : оно может быть получено автоматически с помощью стратегии ImplicitNamingStrategy или определено явно с помощью аннотаций .

ImplicitNamingStrategy управляет тем , как Hibernate получает логическое имя из нашего класса Java и имен свойств. Мы можем выбрать одну из четырех встроенных стратегий или создать свою собственную.

В этом примере мы будем использовать стратегию по умолчанию, ImplicitNamingStrategyJpaCompliantImpl. Используя эту стратегию, логические имена будут такими же, как наши имена классов и свойств Java.

Если мы хотим отклониться от этой стратегии для определенного объекта, мы можем использовать аннотации для выполнения этих настроек . Мы можем использовать аннотацию @Table для настройки имени @Entity . Для свойства мы можем использовать аннотацию @Column :

@Entity
@Table(name = "Customers")
public class Customer {

@Id
@GeneratedValue
private Long id;

private String firstName;

private String lastName;

@Column(name = "email")
private String emailAddress;

// getters and setters

}

При использовании этой конфигурации логические имена для объекта Customer и его свойств будут следующими:

Customer -> Customers
firstName -> firstName
lastName -> lastName
emailAddress -> email

4. Стратегия физического именования

Теперь, когда мы настроили наши логические имена, давайте посмотрим на наши физические имена.

Hibernate использует стратегию физического именования для сопоставления наших логических имен с таблицей SQL и ее столбцами.

По умолчанию физическое имя будет таким же, как и логическое имя , которое мы указали в предыдущем разделе . Если мы хотим настроить физические имена, мы можем создать собственный класс PhysicalNamingStrategy .

Например, мы можем захотеть использовать имена в верблюжьем регистре в нашем коде Java, но мы хотим использовать разделенные подчеркиванием имена для наших реальных имен таблиц и столбцов в базе данных.

Теперь мы могли бы использовать комбинацию аннотаций и пользовательской стратегии ImplicitNamingStrategy для правильного сопоставления этих имен, но Hibernate 5 предоставляет PhysicalNamingStrategy как способ упростить этот процесс. Он берет наши логические имена из предыдущего раздела и позволяет нам настраивать их все в одном месте.

Давайте посмотрим, как это делается.

Во-первых, мы создадим стратегию, которая преобразует имена наших верблюжьих регистров, чтобы использовать наш более стандартный формат SQL:

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy {

@Override
public Identifier toPhysicalCatalogName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
return convertToSnakeCase(identifier);
}

@Override
public Identifier toPhysicalColumnName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
return convertToSnakeCase(identifier);
}

@Override
public Identifier toPhysicalSchemaName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
return convertToSnakeCase(identifier);
}

@Override
public Identifier toPhysicalSequenceName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
return convertToSnakeCase(identifier);
}

@Override
public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
return convertToSnakeCase(identifier);
}

private Identifier convertToSnakeCase(final Identifier identifier) {
final String regex = "([a-z])([A-Z])";
final String replacement = "$1_$2";
final String newName = identifier.getText()
.replaceAll(regex, replacement)
.toLowerCase();
return Identifier.toIdentifier(newName);
}
}

Наконец, мы можем указать Hibernate использовать нашу новую стратегию:

hibernate.physical_naming_strategy=com.foreach.hibernate.namingstrategy.CustomPhysicalNamingStrategy

Используя нашу новую стратегию в отношении объекта « Клиент », физическими именами будут:

Customer -> customers
firstName -> first_name
lastName -> last_name
emailAddress -> email

5. Котируемые идентификаторы

Поскольку SQL является декларативным языком, ключевые слова, формирующие грамматику языка, зарезервированы для внутреннего использования, и их нельзя использовать при определении идентификатора базы данных (например, каталога, схемы, таблицы, имени столбца).

5.1 Ручное экранирование с помощью двойных кавычек

Первый способ избежать идентификатора базы данных — заключить имя таблицы или столбца в двойные кавычки:

@Entity(name = "Table")
@Table(name = "\"Table\"")
public class Table {

@Id
@GeneratedValue
private Long id;

@Column(name = "\"catalog\"")
private String catalog;

@Column(name = "\"schema\"")
private String schema;

private String name;

//Getters and setters
}

5.2. Ручное экранирование с использованием характерного для Hibernate символа обратной кавычки

Кроме того, мы также можем экранировать заданный идентификатор базы данных, используя символ обратной кавычки:

@Entity(name = "Table")
@Table(name = "`Table`")
public class Table {

@Id
@GeneratedValue
private Long id;

@Column(name = "`catalog`")
private String catalog;

@Column(name = "`schema`")
private String schema;

@Column(name = "`name`")
private String name;

//Getters and setters
}

5.3. Глобальный выход с использованием конфигурации гибернации

Другой вариант — установить для свойства hibernate.globally_quoted_identifiers значение true . Таким образом, Hibernate будет избегать всех идентификаторов базы данных. В результате нам не нужно цитировать их вручную.

Чтобы использовать идентификаторы в кавычках в CustomPhysicalNamingStrategy, нам нужно явно использовать метод isQuoted() при создании нового объекта Identifier :

Identifier.toIdentifier(newName, identifier.isQuoted());

6. Заключение

В этой быстрой статье мы узнали о взаимосвязи между стратегиями неявного и физического именования.

Мы также увидели, как настроить неявные и физические имена объекта и его свойства.

Вы можете просмотреть исходный код этого руководства на Github .