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