Hibernate org.hibernate.PropertyAccessException: exception setting property value with CGLIB異常分析及處理
異常信息:
Exception in thread "main" org.hibernate.PropertyAccessException: exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of com.dl.bean.Employee.setDepartment at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValuesWithOptimizer(PojoEntityTuplizer.java:215) at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:185) at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3232) at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129) at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842) at org.hibernate.loader.Loader.doQuery(Loader.java:717) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224) at org.hibernate.loader.Loader.doList(Loader.java:2145) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029) at org.hibernate.loader.Loader.list(Loader.java:2024) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375) at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308) at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106) at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79) at com.dl.test.EmployeeTest.main(EmployeeTest.java:26) Caused by: net.sf.cglib.beans.BulkBeanException: com.dl.bean.Employee cannot be cast to com.dl.bean.Department at com.dl.bean.Employee$$BulkBeanByCGLIB$$a415f505.setPropertyValues(<generated>) at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValuesWithOptimizer(PojoEntityTuplizer.java:212) ... 15 more Caused by: java.lang.ClassCastException: com.dl.bean.Employee cannot be cast to com.dl.bean.Department ... 17 more |
遇此異常很老火,當(dāng)然第一件事就是在google上baidu一把看能解決吧!
google上baidu結(jié)果如下:
查詢結(jié)果中包含null的值,對(duì)于一些數(shù)字或boolean包含null,定義該項(xiàng)時(shí)必須使用wrapper類型,而不能是primitive類型,例如使用Integer而不能是int,Boolean而不能是boolean否則會(huì)拋出exception 結(jié)論是:對(duì)于屬性在set/get時(shí),屬性值為null而出現(xiàn)該異常 |
我對(duì)此種說法不敢茍同,既然google上有這種說法相比就有它存在的道理。
從上述語句中我們得出結(jié)論:在寫pojo類時(shí)最好選用包裝類而不使用java中的基本數(shù)據(jù)類型,以免產(chǎn)生一些莫名其妙的錯(cuò)誤(建議使用5.0以上的jdk版本)大家一直認(rèn)為java是面向?qū)ο蟮恼Z言,這句話在jdk1.4以前是有分歧的,大家都知道java中8個(gè)基本數(shù)據(jù)類型不是對(duì)象,所以這么說還不夠嚴(yán)謹(jǐn),直到jdk5.0的誕生,這句話才勉強(qiáng)成立。我想這也是sun公為什么極力推薦使用包裝類的緣故。
看來還得自己分析這個(gè)異常,那么首先從映射文件及pojo類來下手
Java代碼:
publicclass Employee { private Integer id; private String empname; private Integer empage; private String context; private Integer deptid; private Department department=new Department(); //省略set()、get()方法 } |
<hibernate-mapping package="com.dl.bean"> <class name="Employee" table="employee"> <id name="id" > <generator class="native"/> </id> <property name="empname"/> <property name="empage"/> <property name="context" /> <property name="deptid" insert="false" update="false"/> <many-to-one name="department" column="deptid" cascade="all" class="Employee" /> //此處為錯(cuò)誤的根源,這個(gè)錯(cuò)誤很隱蔽,不仔細(xì)檢查很難發(fā)現(xiàn) </class> </hibernate-mapping> |
不知道至此大家發(fā)現(xiàn)錯(cuò)誤了沒,經(jīng)過本人仔細(xì)檢查以及分析以上pojo類及映射文件,發(fā)現(xiàn)在<many-to-one>標(biāo)簽中class屬性配置出錯(cuò)了,正確的配置應(yīng)為:
<many-to-one name="department" column="deptid" cascade="all" class="Department" />,到此問題徹底解決了,沒什么技術(shù)含量,只是記下來,防止更多人走冤枉路