一尘不染

Hibernate 5.1.x命名策略(与Hibernate 4.x向后兼容)

spring-boot

我正在使用Spring Boot 1.3.3.RELEASE。默认情况下,Spring Boot使用Hibernate
Version4.x。我正在尝试使用新的Hibernate,即5.1.0 FINAL(截至目前)。

我正在使用Gradle,以便覆盖Hibernate版本,所以我添加了以下行

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

我正在使用以下方法命名策略

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
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.x上执行查询

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)


阅读 484

收藏
2020-05-30

共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隐式命名策略

除此之外,Hibernate 5的改进的NamingStrategy可以用来模拟Hibernate
4的行为ImprovedNamingStrategy

2020-05-30