`
lgd_java2eye
  • 浏览: 189589 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

org.hibernate.PropertyNotFoundException

阅读更多

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

Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for auditInfos     
in class EventType    
at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:282)    
at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:275)    
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的处理逻辑是这样的:

private static Method getterMethod(Class theClass, String propertyName) {    
   
    Method[] methods = theClass.getDeclaredMethods();    
    for (int i=0; i 
        // only carry on if the method has no parameters    
        if ( methods[i].getParameterTypes().length==0 ) {    
            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];    
                }    
   
            }    
   
            // if not "get" then try "is"    
            /*boolean isBoolean = methods[i].getReturnType().equals(Boolean.class) ||   
                methods[i].getReturnType().equals(boolean.class);*/   
            if ( methodName.startsWith("is") ) {    
                String testStdMethod = Introspector.decapitalize( methodName.substring(2) );    
                String testOldMethod = methodName.substring(2);    
                if ( testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName) ) {    
                    return methods[i];    
                }    
            }    
        }    
    }    
    return null;    
}   

 

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

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

 

public static String decapitalize(String name) {    
if (name == null || name.length() == 0) {    
    return name;    
}    
if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&    
        Character.isUpperCase(name.charAt(0))){    
    return name;    
}    
char chars[] = name.toCharArray();    
chars[0] = Character.toLowerCase(chars[0]);    
return new String(chars);    
   }   

 

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

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

注意:

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

分享到:
评论

相关推荐

    hibernate错误解决方案

    nested exception is org.hibernate.PropertyNotFoundException: Could not find a getter for ID in class ``` 这表示Hibernate找不到实体类中的 ID 属性的 getter 方法。 **解决方法**: 1. **实体类定义**:...

    Hibernate配置常见错误

    错误表现:执行查询操作时,出现“org.hibernate.PropertyNotFoundException: Could not find a getter for property”异常。 解决方案:在实体类的属性上添加@Column注解,指定对应的数据库列名。例如,`@Column...

    hibernate常见异常

    本文将介绍 Hibernate 中的一些常见异常,包括 net.sf.hibernate.MappingException、net.sf.hibernate.PropertyNotFoundException、org.hibernate.id.IdentifierGenerationException 以及 a different object with ...

    Hibernate映射导致的几个异常

    - **PropertyNotFoundException**:当Hibernate找不到类中特定属性的getter或setter方法时抛出。检查映射文件中定义的属性名称是否与Java类中的属性一致,确保getter和setter方法存在并正确命名。 - **...

    hibernate常见问题及处理.doc

    4. `org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save():` 此异常意味着在尝试保存对象前,对象的主键没有被正确设置。通常,这是由于在映射...

    EL语言遍历集合出现PropertyNotFoundException 的两种情况

    然而,使用EL时可能会遇到`PropertyNotFoundException`,这通常是由于试图访问一个不存在的属性或方法导致的。本文将深入探讨两种可能导致此类异常的情况,并提供相应的解决方案。 ### 情况一:对象属性不存在 EL...

    java.lang.NoSuchMethodError: javax/servlet/jsp/PageContext.getELContext()Ljavax/

    NULL 博文链接:https://albert0707.iteye.com/blog/562969

    hibernate常见错误解决方案

    **PropertyNotFoundException: Could not find a setter for property name in class hibernate.Hello_Bean** **异常描述:** 此异常表明Hibernate试图为实体类中的某个属性设置值时找不到对应的setter方法。 **...

    beanUtils配套

    然而,当我们在使用BeanUtils时,可能会遇到一些运行时的异常,如`PropertyNotFoundException`或`ConversionException`等。为了处理这些异常并记录相关信息,Apache Commons Logging(简称commons-logging)库就显得...

    标签使用

    - **未指定converter的影响**:如果在使用`<rich:listShuttle>`时没有正确设置`converter`属性,则可能会抛出`javax.faces.el.PropertyNotFoundException`异常。这是因为JSF框架无法找到合适的转换器来进行数据类型...

    软件开发中异常分析

    2. **检查配置文件**:对于ORM(对象关系映射)框架如Hibernate,还需检查相关的配置文件(如`.hbm.xml`),确保属性名、数据库列名等配置正确。 3. **代码自动生成工具**:利用IDE(集成开发环境)或其他工具自动...

    commons-beanutils快速封装form表单数据包

    5. **异常处理**:在使用BeanUtils过程中,可能会遇到如`PropertyNotFoundException`(找不到属性)、`ConversionException`(类型转换失败)等异常,需要合理捕获并处理这些异常,以确保程序的健壮性。 6. **...

    Java程序调试与错误收集--代码引起的报错

    **描述:** 使用EL表达式访问对象属性时,如果该属性不存在,则会抛出`PropertyNotFoundException`。 **解决办法:** - 确认对象中是否存在指定的属性。 - 确认EL表达式的写法是否正确。 #### 十二、页面跳转问题 *...

Global site tag (gtag.js) - Google Analytics