1. 程式人生 > >hibernate下兩個相連大寫字元導致Could not find a getter for問題

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的方法也一樣,不過報的是另一個錯誤。。),原因暫不明白- -