Рубрики
Без рубрики

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

Узнайте о взаимосвязи между Неявными и физическими стратегиями именования.

Автор оригинала: baeldung.

1. Обзор

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

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

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

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

Мы будем использовать зависимость basic Hibernate Core для этого урока:


    org.hibernate
    hibernate-core
    5.3.6.Final

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

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

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

В этом примере мы будем использовать стратегию по умолчанию, ImplicitNamingStrategy Jpa-совместимый Impl. При использовании этой стратегии логические имена будут такими же, как имена классов и свойств 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 .

Например, мы можем использовать имена camelcase в нашем коде 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.baeldung.hibernate.namingstrategy.CustomPhysicalNamingStrategy

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

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

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

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

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

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