关于mysql下hibernate实体类字段与数据库关键字冲突的问题
Posted 努力二字需一生写就
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于mysql下hibernate实体类字段与数据库关键字冲突的问题相关的知识,希望对你有一定的参考价值。
好久没写了,都忘记博客了,趁着现在还在公司,写的东西是经过验证的,不是在家凭记忆力写的,正确率有保障,就说说最近遇到的一件事情吧。
以前一直用的oracle数据库,这次项目我负责的模块所在的系统是用的mysql数据库,结果当初建表时候,字段什么的全靠百度,实在是英语不行,然后有个字段叫usage,是mysql数据库的关键字,当时自己测试时候就发现了,但是想着我只是sql语句,加下``,一样可以用,所以就没引起重视。
结果一期已经上线了,现在对这个表要进行其他的维护,才发现用hibernate直接进行增删改时候出了问题,因为它生成的语句肯定是不带``这个进行转义的,而这时候如果你又不想改实体类不想改表字段,那么只需要在实体类配置文件中加上``即可。
具体演示代码如下:
1.初始配置文件:
1 <hibernate-mapping> 2 <class name="com.entity.test" table="test"> 3 <id column="id" name="id" type="java.lang.Long"> 4 <generator class="native"/> 5 </id> 6 <property column="usage" length="1" name="usage" type="java.lang.String"/> 7 </class> 8 </hibernate-mapping>
在这种配置下,直接针对整个实体类进行操作会报错,就是那啥xxx ‘near usage xxx那些东西,就是usage附近有错误,具体的英文不行我也看不懂,只知道它引起。
2.更改后配置文件
<hibernate-mapping> <class name="com.cnnct.test" table="test"> <id column="id" name="id" type="java.lang.Long"> <generator class="native"/> </id> <property column="`usage`" length="1" name="usage" type="java.lang.String"/> </class> </hibernate-mapping>
这样更改后,无需更改其他东西,照常使用即可,那两个`的位置是通常键盘下,数字键1的左边的那个,和~一个键位的,而不是单引号,这个别弄错了。
接下来是题外话,虽然有了这个解决方案,但是最后还是无奈的改了字段,虽然会很麻烦,毕竟一期都已经上线了,而且挺多地方代码用到了这个字段的,也不知道有没有改漏了。之所以不采纳这个解决方案的原因是以后项目进行迭代更替时候,不可避免的有可能还是需要工具类重新生成实体,一般工具生成实体是不会带有``这个的,就会导致报错。然后后来人维护而不是我本人维护,这种错误就比较难找了。
所以总的来说,各位程序猿在定义表结构时候尽量不要用数据库的关键字,定义完字段,感觉有可能是关键字的都先去试一下,免得后面白多这么多功夫。
以上是关于关于mysql下hibernate实体类字段与数据库关键字冲突的问题的主要内容,如果未能解决你的问题,请参考以下文章
java Hibernate 中的表实体类 与 表字段的配置必须一样么?
hibernate 中的ORM是如何与数据库实现存储和查询的