美文网首页JavaWeb
org.hibernate.PropertyNotFoundE

org.hibernate.PropertyNotFoundE

作者: shallwego_ | 来源:发表于2017-03-13 16:51 被阅读402次

    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 显然和<property name="gAccountId" column="G_ACCOUNT_ID"type="Java.lang.String" />无法匹配,抛出异常

    问题:

    今天在调试下钻表格时,出现了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.PropertyNotFoundE

        本文链接:https://www.haomeiwen.com/subject/kdqqnttx.html