发现这个问题你就要注意你的命名了 在实体类里
HIBERNATE问题
1.GET SET方法 要不都是小写 2.不能出现第2个字母是大写 或者 出现两个字母大写的 3.要不第一个大写其他小写
如果我们在HBM.XML中定义
java代码:
<property name="xSize" type="float"/>
在创建Session的时候会告诉你Could not find a getter for xSize
经过Debug看了一下发现不是Hibernate的问题
Hibernate用的方法是
java代码:
BasicPropertyAccessor.java
String methodName = methods[i].getName();
// try "get"
if( methodName.startsWith("get") ) {
String testStdMethod = Introspector.decapitalize(methodName.substring(3) );
String testOldMethod = methodName.substring(3);
if( testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName) ) return methods[i];
}
他调用的是
Introspector.decapitalize(String name);
Sun的注释说明
but in the (unusual) special case when there is more than one character and both the first and second characters are upper case, we leave it alone.
他得到getXSize这个方法名,substring[3]为XSize然后decapitalize之后不修改首位字符,就Could not find a getter for xSize了
这个是Java Bean的Spec里面规定的。方法有多种,你可以写成xsize这种全部小写,或者加"_"字符,如果你首位大写不在第二位就没问题了。
问=======================================================================题:org.hibernate.PropertyNotFoundException: Could not find a getter for attribute
A:这个问题表明:
1)getter()方法写错了,没有按照javaBean的规则写.
2)*.hmb.xml中的属性名和pojo中的是否一致.注意:属性名是否多了空格.
启示:.hbm.xml里的排列最好跟数据库表里的排列一样!最好不要乱改变位置!否则会出莫名其妙的错误!
3)字段的取名要注意。比如数据库中的字段为M_R_ID,映射到hbm.xml为mRId,那么产生的POJO也是mRId,自动产生的getter方法为:getMRId();相应的setter方法一致,这样就会抛出上面所述异常,这个应该是hibernate的模板格式问题。所以尽量要避免这样的命名。
解决方法:
1)换做getmRId(); 问题可解决,没有抛出异常,能取值。
2)修改数据库字段名。这个最好,不会产生以后的不确定因素。
Hibernate的FAQ里面也有记录,简单提到了这个问题
在spring+hibernate框架的java项目开发过程中,经常会遇到这样的错误:
could not find a getter for ... in class ...
可能原因如下:
1.真的没有写getter方法(发生几率:1%)
2.*.hmb.xml文件中的属性名和pojo不一致(*.hbm.xml和*.java没衔接好,不一致),字段属性没有正确配置,比如, *.hmb.xml中*.java的地址要明确(明确指出引用包的完整路径);映射错误;有多个主键时,对生成的联合主键配置错误;拼写错误(包括多空 格)等(发生几率:48%)
3.方法写错/方法名写错,要按照javabean的书写规范写啊,要不然打死也找不到哪儿错了(发生几率:50%)
这里提一下:get/set是不是不允许方法名中有连续两个大写字母,例如
public String getODPType(){
return this.oDPType;
}
public void setODPType(String oDPType){
this.oDPType = oDPType;
}
这样写它就会报错,报找不到getter for oDPType的错误,但下面这样写就可以了
public String odpType;
public String getOdpType(){
return this.odpType;
}
public void setOdpType(String odpType){
this.odpType = odpType;
}
4.其他不明原因(发生几率:1%)
这里说下我的问题:
原来的get方法是getPicId,报错了,修改成小写getpicid问题就解决了(set的方法也一样,不过报的是另一个错误。。),原因暂不明白- -