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

Java Hibernate 5.1.x命名策略(向后兼容Hibernate 4.x),java,hibernate,orm,spring-boot,spring-data-jpa,Java,Hibernate,Orm,Spring Boot,Spring Data Jpa,我使用的是Spring Boot 1.3.3.RELEASE。默认情况下,Spring引导使用Hibernate版本4.x。我正在尝试使用新的Hibernate I.e 5.1.0 FINAL(截至目前) 我使用Gradle来覆盖Hibernate版本,我添加了以下行 ext['hibernate.version']="5.1.0.Final" 遵循 我使用下面的命名策略 spring.jpa.properties.hibernate.naming.implicit-strategy: org

我使用的是Spring Boot 1.3.3.RELEASE。默认情况下,Spring引导使用Hibernate版本4.x。我正在尝试使用新的Hibernate I.e 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;

}
在Hibernate4.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)
    )
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)
    )
在5.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)
    )
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)。首先,您不需要
org.hibernate.boot.model.naming.physicalnamingstrategstandardimpl

因为它不做任何事情,并且由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()));
    }

}
它使用

请记住,如果指定显式名称

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

}
您将拥有一个表名
app\u user
。如果不希望出现这种行为,请使用隐式命名策略

我做了一些命名策略的研究工作。您可以引用,它会生成带有下划线的表名和列名,如您需要的名称和约束名称(唯一、外键)

此类用于生成名称:

如何使用
Hibernate5NamingStrategy

可以使用配置命名策略

例如,要使用不带前缀的策略(如
f_u
):

其他例子:


除此之外,还可以用来模拟Hibernate 4的行为
ImprovedNamingStrategy

我提供我的分析供任何人使用:

如果您在实体类中提供@Table@Column注释,并且名称带有下划线,即用户id即@Column(name=“用户id”),则它将把列名作为用户id;如果您将其作为userid提供,那么如果您不使用任何策略或隐式策略(特别是
spring.jpa.hibernate.naming.implicit strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl
),它将更改为user_id。因此,如果您想要一种策略,其中实体属性名称更改为带有下划线和小写字母的名称,即从userId到user_id,您应该使用隐式或无策略(实际上使用隐式策略)

如果不希望命名策略在列名或类名中添加下划线,则需要使用的策略如下:
spring.jpa.hibernate.naming.physical strategy=org.hibernate.boot.model.naming.physicalnamingstrategstandardimpl
。注释@Table@列的name属性中提供的内容将保持原样


如果不希望提供注释,并且希望手动处理表名和列名,则应扩展类org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl并重写所需的方法。如果您仍然在这里的某些情况下使用注释,请记住,重写的方法将应用于在这些注释中编写的名称
spring.jpa.hibernate.naming.physical strategy=example.CustomStrategy

是否确实已使用
ext['hibernate.version']=“5.1.0.Final”
将hibernate版本更改为5.1.0?我认为你的参考链接中的解决方案对maven有效,但对gradle无效。是的。当Classpath包含hibernate 5.1.0.Final Jarsan时,对我们来说没有前缀
f_
?默认设置非常烦人。@Airhead我更新了我的答案。我不知道哪种默认行为更适合使用。我最终创建了自己的类,该类扩展了上述类并以这种方式配置选项,以便能够从persistence.xml而不是不推荐的配置对象使用它。@Airhead这很有趣。它需要将这种方式添加到文档中。