org.hibernate.PropertyNotFoundException: Could not find a setter for XXX

http://blog.csdn.net/u011650565/article/details/9925381

使用hibernate的时候,会出现PropertyNotFoundException异常,产生原因也很好找,通常的错误原因有:

  1. hibernate配制文件错误,属性里有空格等。
    2.是get方法和属性不对应。

今天调试的过程中,没有配置文件和get方法错误,还是出现了该异常
百度后发现很多都是胡写的,终于找到一篇文章解决了问题
hbm.xml中命名为mystate
修改了get方法的命名,原getMyState() 修改为getMystate()。

原因如下(引用原文):

反编译了hibernate代码发现hibbernate是这么处理的.

首先利用配置文件的package和 name 找到要映射到的类,按上面的配置文件也就是gmt.boss.interfaces.customer.po.TAccount,利用反射取出这个类的信息,取的时候利用了缓存的机制,不是每次都反射一次。

然后用这个类的信息中的get,set方法和 配制文件中进行匹配。以上面的getGAccountId()为例, 先去掉这个方法中的前三位取余下的部分为flag1 =GAccountId,然后调用jdk中的Introspector.decapitalize把这个字符串dropCase得到flag2, 然而 Introspector.decapitalizedropCase的过程,如果这个字符串开头为一个以上的大写字母,那就不做任何操作反回原串,,所以flag2 =GAccountId。

匹配的过程为只要flag1 与flag2 中有一个和 配制文件中的property name一致就为正确的映射。GAccountId 显然和无法匹配,抛出异常

问题:

今天在调试下钻表格时,出现了org.hibernate.PropertyNotFoundException: Could not find a setter for XXX 异常。原因是关系型数据库中字段和hibernate实体类属性名的大小写不一致,导致找不到属性的set方法。

解决方法:

原本在Dao层使用sql语句,在关系型数据库中查询,使用Query对象的createSQLQuery方法,抛出异常。代码如下:

String sql="select *from TB_CUBE_DXSBTJ where YLJG_ID=? and NF_ID=? and SJ_ID=?";
Query query=this.getSession().createSQLQuery(sql);

改为在Dao层使用hql语句,使用Query对象的createQuery方法后解决。代码如下:

String sql="from TbCubeDxsbtj where yljg_id=? and nf_id=? and sj_id=?";
Query query=this.getSession().createQuery(sql);

你可能感兴趣的:(org.hibernate.PropertyNotFoundException: Could not find a setter for XXX)