Статьи

Различная стратегия именования Hibernate

В этой статье рассматриваются различные стратегии именования, предоставляемые hibernate, а также переход от стратегии именования от hibernate.ejb.naming_strategy в hibernate 4 к hibernate.implicit_naming_strategy и hibernate.physical_naming_strategy в hibernate 5. И в конце мы рассмотрим реализация настраиваемой стратегии именования в спящем режиме и конфигурирование для запуска с приложением Spring

Hibernate 4 Naming Strategy

Hibernate использует эту стратегию для сопоставления сущности java и имени атрибута с соответствующей реляционной базой данных и именем столбцов. В hibernate 4 использовалась стратегия именования hibernate.ejb.naming_strategy. Эта стратегия использует EJB3NamingStrategy , ImprovedNamingStrategy , DefaultComponentSafeNamingStrategy и DefaultNamingStrategy для сопоставления имен. EJB3NamingStrategy — это используемая по умолчанию стратегия именования, которая предоставляет имена полей и таблиц верблюда. При именовании столбца внешнего ключа в качестве разделения используется undescore (_). Например, если у вас есть таблица с именем и таблицей 1 с именами столбцов в качестве идентификатора и имени, то в таблице 2 столбец внешнего ключа будет создан как table1_id, и этот EJB3NamingStrategy реализует интерфейс NamingStrategy.

Hibernate 5 Naming Strategy

После выпуска Hibernate 5 hibernate.ejb.naming_strategy больше не доступен, поскольку контракт NamingStrategy часто был недостаточно гибким, чтобы правильно применять данное «правило» именования. Вместо этого были введены две новые стратегии, обеспечивающие глубокую настройку стратегии именования, и это ImplicitNamingStrategy и PhysicalNamingStrategy. Чтобы использовать эту стратегию, необходимо использовать два ключа implicit_naming_strategy и Physical_Naming_strategy. Hibernate 5 предоставляет только одну реализацию PhysicalNamingStrategy — PhysicalNamingStrategyStandardImpl, но несколько реализаций ImplicitNamingStrategy.

ImplicitNamingStrategy используется, когда вы не предоставляете имя базы данных и столбца явно в определении сущности, где как PhysicalNamingStrategy можно использовать для явного определения правил отображения сущности и имени атрибута с именем базы данных и столбцов.

ImplicitNamingStrategy

ImplicitNamingStrategy используется, когда объект не дает явного имени таблице базы данных, с которой он сопоставляется, или когда конкретный атрибут не дает явного имени столбцу базы данных, к которому он сопоставлен. Мы можем указать, какой ImplicitNamingStrategy использовать, используя параметр конфигурации hibernate.implicit_naming_strategy, который принимает default, jpa, legacy-hbm, legacy-jpa и component-path.

PhysicalNamingStrategy

Идея PhysicalNamingStrategy состоит в том, чтобы определять пользовательские правила именования без необходимости жестко кодировать их в отображении с помощью явных имен. Далее следует реализация PhysicalNamingStrategy для определения пользовательского имени таблицы и имени столбца.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package com.devglan;
 
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
 
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
 
import org.apache.commons.lang3.StringUtils;
 
public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy {
 
    @Override
    public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        return name;
    }
 
    @Override
    public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        return name;
    }
 
    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        final List parts = splitAndReplace( name.getText() );
        return jdbcEnvironment.getIdentifierHelper().toIdentifier(
                join( parts ),
                name.isQuoted()
        );
    }
 
    @Override
    public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        return name;
    }
 
    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        final List parts = splitAndReplace( name.getText() );
        return jdbcEnvironment.getIdentifierHelper().toIdentifier(
                join( parts ),
                name.isQuoted()
        );
    }
 
    private LinkedList splitAndReplace(String name) {
        LinkedList result = new LinkedList<>();
        for ( String part : StringUtils.splitByCharacterTypeCamelCase( name ) ) {
            if ( part == null || part.trim().isEmpty() ) {
                continue;
            }
            result.add( part.toUpperCase( Locale.ROOT ) );
        }
        return result;
    }
 
    private String join(List parts) {
        boolean firstPass = true;
        String separator = "";
        StringBuilder joined = new StringBuilder();
        for ( String part : parts ) {
            joined.append( separator ).append( part );
            if ( firstPass ) {
                firstPass = false;
                separator = "_";
            }
        }
        return joined.toString();
    }
}

Чтобы использовать эту пользовательскую стратегию в режиме гибернации, ниже приведена конфигурация.

1
jpaProperties.put("hibernate.physical_naming_strategy", "com.devglan.config.CustomPhysicalNamingStrategy");

Стратегия именования Hibernate в Spring Boot

Как мы уже говорили, hibernate предоставляет две разные стратегии именования, тогда как Spring Boot конфигурирует физическую стратегию именования с помощью SpringPhysicalNamingStrategy, где все точки заменяются подчеркиванием, а верблюжий корпус заменяется подчеркиванием, а все имена таблиц генерируются в нижнем регистре. Например, объект USERDETAILS отображается в таблицу user_details

Если вы хотите использовать собственную стратегию именования, реализованную выше, вы можете выполнить следующую настройку в файле application.properties.

1
spring.jpa.hibernate.naming.physical-strategy=com.devglan.config.CustomPhysicalNamingStrategy);

Вывод

В этой статье мы узнали о различных стратегиях именования, предоставляемых spring boot и hibernate, и о способах реализации нашей собственной стратегии именования. Если у вас есть что-то, что вы хотите добавить или поделиться, пожалуйста, поделитесь этим ниже в разделе комментариев .

Смотрите оригинальную статью здесь: Различные стратегии именования в Hibernate

Мнения, высказанные участниками Java Code Geeks, являются их собственными.