Spring boot 自定义数据库命名策略

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

猜你喜欢

转载自blog.csdn.net/yozheng/article/details/80289990