1. Spring boot 默认是有数据库命名策略的,比如实体是AdminUser, 那么映射到数据库的时候是:admin_user。那么如果这样已经符合需求,那就什么都不需要操作。但是一般情况下,我们的数据库表都喜欢加上一些前缀,比如:tb_admin_user这样。那么这样可以用自定义命名策略来实现。
Spring boot默认:
#spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl2. 自定义命名策略:实现方式,通过继承PhysicalNamingStrategyStandardImpl 或实现PhysicalNamingStrategy 接口。
3. 新建类:DataBaseNamingStrategy
package com.yozheng.springboot.demo.common;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* 自定义数据库映射名称策略
*/
@Component
public class DataBaseNamingStrategy implements PhysicalNamingStrategy {
@Value("${database.prefix}")
private String prefix; //读取application.properties配置的前缀
protected String addUnderscores(String name) {
if (name == null) {
return null;
}
StringBuffer stringBuffer = new StringBuffer(name.replace('.', '_'));
for (int i = 1; i < stringBuffer.length() - 1; i++) {
if (Character.isLowerCase(stringBuffer.charAt(i-1)) && Character.isUpperCase(stringBuffer.charAt(i)) && Character.isLowerCase(stringBuffer.charAt(i+1))) {
stringBuffer.insert(i++, '_');
}
}
return stringBuffer.toString().toLowerCase();
}
@Override
public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
return identifier;
}
@Override
public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
return identifier;
}
@Override
public Identifier toPhysicalTableName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
return Identifier.toIdentifier(prefix + addUnderscores(identifier.getText()));
}
@Override
public Identifier toPhysicalSequenceName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
return identifier;
}
@Override
public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
return Identifier.toIdentifier(addUnderscores(identifier.getText()));
}
}
只需要实现上面:toPhysicalTableName(这个是映射表名), toPhysicalColumnName(映射字段名称)
4. 在application.properties文件配置信息。
#配置自定义命名策略
spring.jpa.hibernate.naming.physical-strategy=com.yozheng.springboot.demo.common.DataBaseNamingStrategy
#数据库表名前缀
database.prefix=tb_这样实体里定义:AdminUser 最终到数据库表是: tb_admin_user

本文介绍了如何在Spring Boot中自定义数据库命名策略,以满足在实体名与数据库表名间添加特定前缀的需求。通过继承PhysicalNamingStrategyStandardImpl或实现PhysicalNamingStrategy接口创建新的命名策略类,并覆盖toPhysicalTableName和toPhysicalColumnName方法。最后,在application.properties中配置该自定义策略。
1944

被折叠的 条评论
为什么被折叠?



