org.hibernate.PropertyNotFoundException

在利用hibernate做ORM时,如果对于hbm文件的属性,在java的pojo类中没有对应的get和set方法,则会产生如下异常:

Java代码   收藏代码
  1. Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for auditInfos       
  2. in class EventType      
  3. at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:282)      
  4. at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:275)      
  5. at org.hibernate.mapping.Property.getGetter(Property.java:272)    

 

但是今天遇到了一种情况,就是写上某个属性的get和set方法时,同样会出现该异常,该pojo的属性是eTypeName则对应的方法名称为getETypeName();跟踪hibernate的堆栈报错信息,查找到:

org.hibernate.property.BasicPropertyAccessor.createGetter的private static Method getterMethod(Class theClass, String propertyName)方法,其中对于get的处理逻辑是这样的:

Java代码   收藏代码
  1. private static Method getterMethod(Class theClass, String propertyName) {      
  2.      
  3.     Method[] methods = theClass.getDeclaredMethods();      
  4.     for (int i=0; i   
  5.         // only carry on if the method has no parameters      
  6.         if ( methods[i].getParameterTypes().length==0 ) {      
  7.             String methodName = methods[i].getName();      
  8.      
  9.             // try "get"      
  10.             if ( methodName.startsWith("get") ) {      
  11.                 String testStdMethod = Introspector.decapitalize( methodName.substring(3) );      
  12.                 String testOldMethod = methodName.substring(3);      
  13.                 if ( testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName) ) {      
  14.                     return methods[i];      
  15.                 }      
  16.      
  17.             }      
  18.      
  19.             // if not "get" then try "is"      
  20.             /*boolean isBoolean = methods[i].getReturnType().equals(Boolean.class) ||    
  21.                 methods[i].getReturnType().equals(boolean.class);*/     
  22.             if ( methodName.startsWith("is") ) {      
  23.                 String testStdMethod = Introspector.decapitalize( methodName.substring(2) );      
  24.                 String testOldMethod = methodName.substring(2);      
  25.                 if ( testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName) ) {      
  26.                     return methods[i];      
  27.                 }      
  28.             }      
  29.         }      
  30.     }      
  31.     return null;      
  32. }     

 

这里methodName的值为getETypeName,propertyName的值为eTypeName,利用java.beans.Introspector进行对第一个字母的小写化操作得到testStdMethod,去掉get得到的是testOldMethod。

但是问题就出来了,前者的小写操作是有前提的,根据源码可知:

 

Java代码   收藏代码
  1. public static String decapitalize(String name) {      
  2. if (name == null || name.length() == 0) {      
  3.     return name;      
  4. }      
  5. if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&      
  6.         Character.isUpperCase(name.charAt(0))){      
  7.     return name;      
  8. }      
  9. char chars[] = name.toCharArray();      
  10. chars[0] = Character.toLowerCase(chars[0]);      
  11. return new String(chars);      
  12.    }     

 

对于第一个字符和第二个字符都是大写的情况下,则返回的是原来的字符,因此在这种情况下,去掉get的ETypeName在decapitalize之后仍然是ETypeName,所以两者都得到的是ETypeName,而不再执行第14行代码,所以private static Method getterMethod(Class theClass, String propertyName)得到的是null,因此会产生对于某某属性找不到get方法的异常出来。

解决办法可以将getETypeName改成geteTypeName,或者干脆将属性名改成ETypeName。

注意:

   属性名字不能以第一个字母小写,第二个字母大写的方式来命名eg:eType,这样的名字就不行,就报上面的异常信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值