Автор оригинала: 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 До Стратегии именования случаев Змеи класс, ознакомьтесь также с этой статьей .