hibernate下兩個相連大寫字元導致Could not find a getter for問題
發現這個問題你就要注意你的命名了 在實體類裡
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的方法也一樣,不過報的是另一個錯誤。。),原因暫不明白- -