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.PhysicalNamingStrategyStandardImpl
2. 自定义命名策略:实现方式,通过继承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