Стратегия именования Hibernate в Spring Boot
В этой статье мы поговорим о стратегиях именования. Главное правило по умолчаний: они должны быть интуитивно понятными. Давайте проверим, применимо ли это правило к стандартному приложению 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