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

Стратегия физического именования в режиме гибернации

Узнайте, как работает стратегия Hibernate PhysicalNamingStrategy и как настроить сопоставление атрибутов сущностей и идентификаторов базы данных.

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

Вступление

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

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

Начиная с версии 5, Hibernate предлагает интерфейс PhysicalNamingStrategy для настройки сопоставления атрибутов сущностей и идентификаторов базы данных.

Интерфейс Hibernate PhysicalNamingStrategy выглядит следующим образом:

Методы Hibernate PhysicalNamingStrategy позволяют настраивать соглашения об именах по умолчанию для следующих идентификаторов базы данных:

  • toPhysicalCatalogName – настройка соглашения об именовании каталога базы данных по умолчанию
  • toPhysicalSchemaName – настройка соглашения об именовании схемы базы данных по умолчанию
  • toPhysicalTableName – настройка соглашения об именовании таблиц базы данных по умолчанию
  • toPhysicalSequenceName – настройка соглашения об именовании последовательностей баз данных по умолчанию
  • toPhysicalColumnName – настройка соглашения об именовании столбцов таблицы базы данных по умолчанию

По умолчанию реализацией интерфейса PhysicalNamingStrategy является стандартный класс PhysicalNamingStrategy, включающий .

Настройка физической именнойстратегии Hibernate

Если вы хотите предоставить сопоставление camelCase по умолчанию для snake_case между атрибутами сущности Java и идентификаторами базы данных, вы можете создать следующую CamelCaseToSnakeCaseNamingStrategy , которая расширяет класс по умолчанию PhysicalNamingStrategyStandardImpl и определяет новые правила сопоставления по умолчанию:

public class CamelCaseToSnakeCaseNamingStrategy 
        extends PhysicalNamingStrategyStandardImpl {

    public static final String CAMEL_CASE_REGEX = "([a-z]+)([A-Z]+)";
    public static final String SNAKE_CASE_PATTERN = "$1\\_$2";

    @Override
    public Identifier toPhysicalCatalogName(
            Identifier name, JdbcEnvironment context) {
        return formatIdentifier(
            super.toPhysicalCatalogName(name, context)
        );
    }

    @Override
    public Identifier toPhysicalSchemaName(
            Identifier name, JdbcEnvironment context) {
        return formatIdentifier(
            super.toPhysicalSchemaName(name, context)
        );
    }

    @Override
    public Identifier toPhysicalTableName(
            Identifier name, JdbcEnvironment context) {
        return formatIdentifier(
            super.toPhysicalTableName(name, context)
        );
    }

    @Override
    public Identifier toPhysicalSequenceName(
            Identifier name, JdbcEnvironment context) {
        return formatIdentifier(
            super.toPhysicalSequenceName(name, context)
        );
    }

    @Override
    public Identifier toPhysicalColumnName(
            Identifier name, JdbcEnvironment context) {
        return formatIdentifier(
            super.toPhysicalColumnName(name, context)
        );
    }

    private Identifier formatIdentifier(
            Identifier identifier) {
        if (identifier != null) {
            String name = identifier.getText();

            String formattedName = name.replaceAll(
                CAMEL_CASE_REGEX, 
                SNAKE_CASE_PATTERN
            ).toLowerCase();

            return !formattedName.equals(name) ?
                    Identifier.toIdentifier(
                        formattedName, 
                        identifier.isQuoted()
                    ) :
                    identifier;
        } else {
            return null;
        }
    }
}

Если вы хотите использовать camelCase для стратегии именования snake_case, вам не нужно создавать стратегию CamelCaseToSnakeCaseNamingStrategy , поскольку вы можете получить ее через проект Типы гибернации .

Регистрация пользовательской физической именнойстратегии гибернации

Если вы используете Spring Boot, вы можете зарегистрировать гибернацию клиента PhysicalNamingStrategy с помощью свойства конфигурации hibernate.physical_naming_strategy Hibernate:

spring.jpa.properties.hibernate.physical_naming_strategy=com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy

Или, если вы используете Java EE или Jakarta EE, вы можете предоставить стратегию физического именования Hibernate через persistence.xml файл свойств:


Вывод

Интерфейс Hibernate PhysicalNamingStrategy и свойство конфигурации hibernate.physical_naming_strategy позволяют настраивать сопоставление между идентификаторами объектов Java и баз данных.

Поэтому стратегия Hibernate PhysicalNamingStrategy полезна для определения стратегий сопоставления по умолчанию, как пример Java camel для сопоставления базы данных snake_case. Для получения более подробной информации о типах гибернации От camelCase До Стратегии именования случаев Змеи класс, ознакомьтесь также с этой статьей .