Ama*_*har 4 java orm hibernate spring-data-jpa 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"
Run Code Online (Sandbox Code Playgroud)
我正在使用以下方法命名策略
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
Run Code Online (Sandbox Code Playgroud)
我有一个实体课
@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;
}
Run Code Online (Sandbox Code Playgroud)
在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)
)
Run Code Online (Sandbox Code Playgroud)
在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)
)
Run Code Online (Sandbox Code Playgroud)
如何设置命名策略,使Hibernate在表名和列名上使用5.x下划线(作为4.x)
首先,您不需要
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()));
}
}
Run Code Online (Sandbox Code Playgroud)
请记住,如果您指定一个明确的名称
@Entity
@Table(name = "AppUser")
public class AppUser {
}
Run Code Online (Sandbox Code Playgroud)
无论如何,您将有一个表名app_user。如果您不希望这种行为,请使用隐式命名策略。
我做了一些有关命名策略的研究。您可以参考Hibernate5NamingStrategy,它会生成带有下划线的表和列名称(如您所需要的)和约束名称(唯一,外键)。
此类用于生成名称:HibernateNamingStrategy。
如何使用 Hibernate5NamingStrategy
可以使用StrategyOptions配置命名策略。
例如,要使用不带前缀(例如f_)的策略:
StrategyOptions options = StrategyOptions.builder().withoutPrefixes().build();
Hibernate5NamingStrategy strategy = new Hibernate5NamingStrategy(options);
Run Code Online (Sandbox Code Playgroud)
其他示例:Hibernate 5隐式命名策略
除此之外,Hibernate 5的改进的NamingStrategy可以用来模拟Hibernate 4的行为ImprovedNamingStrategy。
| 归档时间: |
|
| 查看次数: |
6235 次 |
| 最近记录: |