Стратегия именования 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