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

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

1. обзор

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

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

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

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

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


    org.hibernate
    hibernate-core
    5.3.6.Final

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

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

ImplicitNamingStrategy управляет тем, как Hibernate получает логическое имя из нашего класса Java и имен свойств. We can select from four built-in strategies, or we can create our own.

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

If we want to deviate from this strategy for a specific entity, we can use annotations to make those customizations. Мы можем использовать аннотацию@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 и ее столбцами.

By default, the physical name will be the same as the logical name, который мы указали в предыдущем разделе. Если мы хотим настроить физические имена, мы можем создать собственный класс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.example.hibernate.namingstrategy.CustomPhysicalNamingStrategy

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

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

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

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

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

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