处理遗留表是个头疼的问题。
关于如何处理遗留表名的问题,张喜硕在其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);
}
}
}
总结
处理历史遗留问题,虽然头疼,但也迫使我们开动脑筋。同时,也在无形中,更加了解了面向接口开发的灵活性。更重要的,它告诉了我们:一定要规范,一定要约定大于配置,一定要使自己的代码在成为历史时,能少些问题。
约定大于配置!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。