今天在进行entity注解方式配置时,总是报错说在数据库中找不到相应的表,并且显示找不到的表都加了下划线,例如UserInfo实体中,有属性userName,那么hibernate会去在数据中找
user_info表和其中user_name属性。
而我的数据库中实际是userInfo表和属性userName。
找了好久的原因,发现是配置hibernate时候配置了命名策略,默认的是ImprovedNamingStrategy类,该类实现了NamingStrategy接口,在查看起源码中发现,如果实体类名中非首字母为大写,会在该字母前添加下划线,并在最后进行toLowerCase()操作。这样就会出现我遇到的情况。所以我自己写了一个类实现了NamingStrategy,并重写里面的方法。主要代码如下:
在这过程中发现一个问题,如果你的数据库在windows服务器上,那么数据库中的表名或者列名为大写或者小写都可以,因为windows对大小写不敏感,但是如果服务器是Linux,那就要注意了,一定要区分大小写。
user_info表和其中user_name属性。
而我的数据库中实际是userInfo表和属性userName。
找了好久的原因,发现是配置hibernate时候配置了命名策略,默认的是ImprovedNamingStrategy类,该类实现了NamingStrategy接口,在查看起源码中发现,如果实体类名中非首字母为大写,会在该字母前添加下划线,并在最后进行toLowerCase()操作。这样就会出现我遇到的情况。所以我自己写了一个类实现了NamingStrategy,并重写里面的方法。主要代码如下:
/**
* 这是默认的
*/
protected static String addUnderscores(String name) {
StringBuffer buf = new StringBuffer( name.replace('.', '_') );
for (int i=1; i<buf.length()-1; i++) {
if (
Character.isLowerCase( buf.charAt(i-1) ) &&
Character.isUpperCase( buf.charAt(i) ) &&
Character.isLowerCase( buf.charAt(i+1) )
) {
buf.insert(i++, '_');
}
}
return buf.toString().toLowerCase();
}
/**
* 这是我简单修改后的,其他的有些方法也可能需要修改(暂时没有发现问题,以后遇到 在进行修改吧!
*/
protected static String addUnderscores(String name) {
StringBuffer buf = new StringBuffer( name.replace('.', '_') );
//因为与同事沟通后,数据库中的大小写与实体总都保持一致,所以实体的属性
//原样返回
return buf.toString();
}
在这过程中发现一个问题,如果你的数据库在windows服务器上,那么数据库中的表名或者列名为大写或者小写都可以,因为windows对大小写不敏感,但是如果服务器是Linux,那就要注意了,一定要区分大小写。