spring-boot 遗留表的字段命名不符合hibernate规范怎么办

处理遗留表是个头疼的问题。
关于如何处理遗留表名的问题,张喜硕在其Hibernate 自定义表名映射给出了详细的方案。

注意: 如果是使用的测试数据库H2,则重写命名方法后,也不会生效。这可能是由于spring-boot认为如果是启用的默认H2数据库,则无需关注表名或是列表吧。

本节,我们将在其方案下,解决列名的命名不符合规范的问题。

方案设计

我们在学习重写表名时,发现SpringPhysicalNamingStrategy类同时有设置列表的方法。但很遗憾,在重写列名的方法toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment)中,我们无法获取相应的数据表名或是相应的列,当然也就无法通过获取数据表名实体的注解,或是列的注解了。

最终方案确定为:在想重写的列上,我们加入@Column(name = "yz_force_name_xxxx")的相应注解,然后在toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment)方法中,对name的值进行判断,如果包含了yz_force_name_前缀,则进行重写,否则调用父类的方法

代码设计

package com.mengyunzhi.check_apply_online.config;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy;

import javax.persistence.Table;

public class DataTablePhysicalNamingStrategy extends SpringPhysicalNamingStrategy {
    private static final Logger logger = LoggerFactory.getLogger(DataTablePhysicalNamingStrategy.class);
   
    /**
     * 重写父类生成列名的方法
     * @author 河北工业大学梦云智开发团队 panjie
     */
    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        logger.debug("判断是否进行字段名称的重写");
        Boolean override = false;
        Identifier realName = null;
        String columnName = name.getCanonicalName();
        if (columnName.length() > 14 ) {
            String suffix = columnName.substring(0, 14);
            if (suffix.equals("yz_force_name_")) {
                String realColumnName = columnName.substring(14, columnName.length());
                realName = new Identifier(realColumnName, name.isQuoted());
                override = true;
            }
        }

        logger.debug("重写,则返回重写后的名称,否则调用父类");
        if (override) {
            return realName;
        } else {
            return super.toPhysicalColumnName(name, jdbcEnvironment);
        }
    }
}

总结

处理历史遗留问题,虽然头疼,但也迫使我们开动脑筋。同时,也在无形中,更加了解了面向接口开发的灵活性。更重要的,它告诉了我们:一定要规范,一定要约定大于配置,一定要使自己的代码在成为历史时,能少些问题。

约定大于配置!

相关推荐