«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.baeldung.hibernate.namingstrategy.CustomPhysicalNamingStrategy
Использование нашей новой стратегии по отношению к объекту Customer, физическими именами будут:
Customer -> customers
firstName -> first_name
lastName -> last_name
emailAddress -> email
5. Заключение
В этой быстрой статье мы узнали о взаимосвязи между стратегиями неявного и физического именования.
Мы также увидели, как настроить неявные и физические имена объекта и его свойства.
Вы можете просмотреть исходный код этого руководства на Github.