当JPA遇上MySQL表名全大写

最近在搞一个HRMS,功能不算复杂,先按下不表。这里说一个魂淡的小问题,很纠结,也很烦人。

公司之前有项目是用MySQL的,是我管的。这次这个项目也不大,就继续用那个MySQL吧。我一直知道MySQL在Linux上有字段名表名等的大小写问题,于是为了避免这个问题,选择了全大写的字段名和表名,心说虽然咱用的是JPA,只要使用注解写清楚表名和字段名是大写的,不也没事么。
实际上证明,想象比生活丰富的多,亲们。我用JPA实现登陆的时候,报错说表不存在,表名是全小写的。接下来,折腾才刚刚开始。此时是上午十点多。
解决这个问题,第一步肯定是改MySQL的cnf,改成不区分大小写,心说这就解决问题了吧。事实证明,图样图森破。。。改成大小写不敏感以后,这个表干脆怎么都访问不了了,不管是大写还是小写,show tables可以看到,但是select的时候怎么折腾都不出来。
无奈,只能改回去。但是表结构我没备份过啊,再装个Oracle又麻烦,怎么办呢?既然MySQL那边解决起来麻烦,我们在Java这想想办法吧。简单的分析一下过程,浏览器点按钮,发起请求到后台,Controller接到请求后通过service找到对应的dao,dao又通过Spring Data找到Hibernate实现的JPA规范,再转化成SQL语句发送给数据库执行。只要能在发送前把表名改成大写就能解决问题了。
那么这个把表名改成大写或者小写,是在哪里执行的呢?不知道同学们还记不记得,JPA对字段有一个转换,a_b会转换成aB。这个当然不是Java内核实现的,这个是Hibernate的JPA实现做的。具体到代码,这个东西是org.hibernate.cfg.ImprovedNamingStrategy,命名规则类。Hibernate实现的这个,就是转换驼峰规则的功能。我注解里表名写的是大写,但是输出的sql语句里是小写,毫无疑问,这里有转换成小写的代码。那么我只要实现一个转换成大写表名的方法就对了。

public class MySQLUpperCaseStrategy extends ImprovedNamingStrategy {

private static final long serialVersionUID = 1383021413247872469L;

@Override
public String tableName(String tableName) {
return tableName.toUpperCase();
}
}

简单又好用,不必改原来的数据库任何配置了。

转自http://xhrtechblog.com/2014/08/24/jpa_uppercase/

猜你喜欢

转载自blog.csdn.net/q979076061/article/details/51539960
今日推荐