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 .