Стратегия именования Hibernate 5.1.x (обратно совместимая с Hibernate 4.x)

Я использую Spring Boot 1.3.3.RELEASE. По умолчанию Spring Boot использует Hibernate версии 4.x. Я пытаюсь использовать новый Hibernate т.е. 5.1.0 FINAL (на данный момент).

Я использую Gradle, чтобы переопределить версию Hibernate, я добавил следующую строку

ext['hibernate.version']="5.1.0.Final"

пошли шаги SpringBoot 1.3.0 с поддержкой hibernate 5?

Я использую следующие для наименования Стратегии

spring.jpa.properties.hibernate.naming.implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl

spring.jpa.properties.hibernate.naming.physical_strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

У меня есть класс Entity

@Entity
public class AppUser {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Length(max = 100)
    private String username;

    @NotNull
    @Length(max = 100)
    private String firstName;

    @NotNull
    @Length(max = 100)
    private String lastName;

    @Length(max = 100)
    private String middleName;

    @NotNull
    @Length(max=100)
    private String email;

    @NotNull
    @Length(max = 100)
    private String password;

    @NotNull
    private boolean enabled;

}

На Hibernate 4.x он выполняет запрос

create table app_user (
        id bigint not null auto_increment,
        email varchar(100) not null,
        enabled bit not null,
        first_name varchar(100) not null,
        last_name varchar(100) not null,
        middle_name varchar(100),
        password varchar(100) not null,
        username varchar(100) not null,
        primary key (id)
    )

на 5.х он выполнил запрос

create table AppUser (
        id bigint not null auto_increment,
        email varchar(100) not null,
        enabled bit not null,
        firstName varchar(100) not null,
        lastName varchar(100) not null,
        middleName varchar(100),
        password varchar(100) not null,
        username varchar(100) not null,
        primary key (id)
    )

Как настроить стратегию именования таким образом, чтобы Hibernate использовал подчеркивание 5.x (как 4.x) для имени таблицы и имени столбца

1 ответ

Во-первых, вам не нужно org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

из-за этого ничего не делает и используется Hibernate по умолчанию.

Hibernate 5 не имеет стратегии, которую вы хотите. Все стратегии соответствуют JPA (генерируйте такие имена, как AppUser). Так что вам нужно реализовать свое.

Для примера физическая стратегия именования

public class UnderscorePhysicalStartegy extends PhysicalNamingStrategyStandardImpl {

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return context.getIdentifierHelper()
                .toIdentifier(NamingStrategyUtils.classToName(name.getText()));
    }

}

Он использует NamingStrategyUtils.

Имейте в виду, если вы укажете явное имя

@Entity
@Table(name = "AppUser")
public class AppUser {

}

у вас все равно будет имя таблицы app_user, Если вы не хотите такого поведения, используйте неявную стратегию именования.

Я провел некоторую исследовательскую работу над стратегиями именования. Вы можете ссылаться на Hibernate5NamingStrategy, он генерирует имена таблиц и столбцов с нужными вам символами подчеркивания и именами ограничений (уникальный, внешний ключ).

Этот класс используется для генерации имен: HibernateNamingStrategy.

Как пользоватьсяHibernate5NamingStrategy

Стратегия именования может быть настроена с помощью StrategyOptions.

Например, использовать стратегию без префиксов (например, f_):

StrategyOptions options = StrategyOptions.builder().withoutPrefixes().build();
Hibernate5NamingStrategy strategy = new Hibernate5NamingStrategy(options);

Другие примеры: Hibernate 5 Стратегия неявного именования

Кроме того, ImprovedNamingStrategy для Hibernate 5 можно использовать для имитации поведения Hibernate 4. ImprovedNamingStrategy,

Я предоставляю свой анализ для использования любым желающим:

Если вы предоставляете аннотации @Table и @Column в своих классах сущностей с именами, указанными с подчеркиванием, то есть user_id, то есть @Column(name="user_id"), он примет имя столбца как user_id; если вы укажете его как идентификатор пользователя, он изменится на user_id, если вы не используете стратегию или неявную стратегию (в частности,spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl). Итак, если вам нужна стратегия, в которой имя атрибута объекта изменяется на одно с подчеркиванием и строчными буквами, то есть что-то от userId до user_id, вы должны использовать неявную стратегию или стратегию без (которая фактически использует неявную стратегию).

Если вы не хотите, чтобы ваша стратегия именования добавляла подчеркивание к имени столбца или имени класса, тогда стратегия, которую вам нужно использовать, будет выглядеть так: spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl. То, что вы указываете в аннотациях @Table и атрибут name @ Column, останется без изменений.

Если вы не хотите предоставлять аннотации и хотите вручную обрабатывать имя таблицы и имена столбцов, вам следует расширить класс org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl и переопределить необходимые методы. Если вы все еще используете аннотации для некоторых случаев, помните, что переопределенные методы будут применяться к именам, написанным в этих аннотациях.spring.jpa.hibernate.naming.physical-strategy=example.CustomStrategy

Другие вопросы по тегам