精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-10
在利用hibernate做ORM时,如果对于hbm文件的属性,在java的pojo类中没有对应的get和set方法,则会产生如下异常: java 代码
但是今天遇到了一种情况,就是写上某个属性的get和set方法时,同样会出现该异常,该pojo的属性是eTypeName则对应的方法名称为getETypeName();跟踪hibernate的堆栈报错信息,查找到: org.hibernate.property.BasicPropertyAccessor.createGetter的private static Method getterMethod(Class theClass, String propertyName)方法,其中对于get的处理逻辑是这样的: java 代码
这里methodName的值为getETypeName,propertyName的值为eTypeName,利用java.beans.Introspector进行对第一个字母的小写化操作得到testStdMethod,去掉get得到的是testOldMethod。 但是问题就出来了,前者的小写操作是有前提的,根据源码可知: java 代码
对于第一个字符和第二个字符都是大写的情况下,则返回的是原来的字符,因此在这种情况下,去掉get的ETypeName在decapitalize之后仍然是ETypeName,所以两者都得到的是ETypeName,而不再执行第14行代码,所以private static Method getterMethod(Class theClass, String propertyName)得到的是null,因此会产生对于某某属性找不到get方法的异常出来。 解决办法可以将getETypeName改成geteTypeName,或者干脆将属性名改成ETypeName。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-06-10
和Hibernate有什么关系,这是JavaBean的规范。好好读读JavaBean的规范。
|
|
返回顶楼 | |
发表时间:2007-06-15
标准的javabean规范是要求
属性第一个字母小写 如:abcDef 相应属性的方法 getAbcDef() setAbcDef() 另外,eclipse的代码自动补全功能会自动为你生成符合规范的JavaBean的:) |
|
返回顶楼 | |
发表时间:2007-06-15
楼上说的没错,但是我说的情况是属性名称第一个字母小写,第二个字母大写,例如:eTypeName,则按照javabean specification规定的getter方法为getETypeName,则会出现找不到getter方法的错误。
今天看了一下javabean specification,规定了一般的属性名称首字母小写,如果遇到前两个字母大写的属性,则getter方法保持属性名称不变,例如URL属性的getter方法为getterURL,但是并没有规定类似eTypeName这样的属性的getter方法写成geteTypeName的形式。 |
|
返回顶楼 | |
发表时间:2007-06-15
如果要符合javabean规范,则只能将eTypeName改成ETypeName,把getter方法改成geteTypeName只是一个tricky的做法。
|
|
返回顶楼 | |
浏览 7542 次