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

·

2 min read

В этой статье мы поговорим о стратегиях именования. Главное правило по умолчаний: они должны быть интуитивно понятными. Давайте проверим, применимо ли это правило к стандартному приложению Spring Boot с конфигурацией по умолчанию, использующему Hibernate в качестве реализации JPA. Представьте, что у вас есть сущность "PayType".

Давайте угадаем, с каким именем таблицы в базе данных она связана. Первый пример:

@Entity
public class PayType {
    // поля опущены
}

Для меня наиболее интуитивно понятным именем таблицы было бы имя класса, которым является PayType. Проведя тест с SQLite, мы обнаруживаем, что имя связанной таблицы на самом деле pet_type. Давайте зададим имя явно с помощью @Table:

@Entity
@Table(name = "PayType")
public class PayType {
    // поля опущены
}

На этот раз мы ожидаем увидеть PayType, но если запустить тест... снова pay_type! Что ж, давайте обернем имя таблицы в кавычки. Это позволит сохранить не только определенное имя, но и регистр.

@Entity
@Table(name = ""PayType"")
public class PayType {
    // поля опущены
}

И снова наши ожидания оказались неверными, и мы видим "pay_type", но теперь в кавычках!

Spring Boot настраивает стратегию физического именования с помощью SpringPhysicalNamingStrategy, где все точки заменяются символами подчеркивания, а camelCase заменяется символами подчеркивания, и все имена таблиц генерируются в нижнем регистре.

Если мы хотим настроить физические имена, мы можем создать собственный класс PhysicalNamingStrategy.

package com.ulugov.unisalary;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

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) {
        return name;
    }

    @Override
    public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        return name;
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        return Identifier.toIdentifier(name.getCanonicalName());
    }

}

В файле конфигурации application.properties указываем Hibernate использовать нашу стратегию:

spring.jpa.hibernate.naming.physical-strategy=com.ulugov.unisalary.CustomPhysicalNamingStrategy