org.hibernate.PropertyNotFoundException
来源:互联网 发布:数据分析属于什么专业 编辑:程序博客网 时间:2024/05/18 00:19
在利用hibernate做ORM时,如果对于hbm文件的属性,在java的pojo类中没有对应的get和set方法,则会产生标题所述异常,原因通常是属性和方法名称不对应或映射文件里属性有空格。
但是今天遇到了一种情况,就是写上某个属性的get和set方法时,同样会出现该异常,该pojo的属性是tUserName则对应的方法名称为getTUserName();跟踪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之后仍然是TUserName,所以两者都得到的是TUserName,而不再执行第14行代码,所以private static Method getterMethod(Class theClass, String propertyName)得到的是null,因此会产生对于某某属性找不到get方法的异常出来。
解决办法可以将getTUserName改成getTuserName,或者干脆将属性名改成TuserName。
结论: 属性名字最好不要用第一个字母小写,第二个字母大写的方式来命名(如:eMail),这样的名字就不行,就报上面的异常信息,不然你得十分小心get和set方法名称前几个字母的大小写。
0 0
- hibernate org.hibernate.PropertyNotFoundException
- org.hibernate.PropertyNotFoundException
- org.hibernate.PropertyNotFoundException错误
- org.hibernate.PropertyNotFoundException
- org.hibernate.PropertyNotFoundException
- Caused by: org.hibernate.PropertyNotFoundException:
- org.hibernate.PropertyNotFoundException: Could not find a getter
- org.hibernate.PropertyNotFoundException: Could not find a getter for XXX
- " org.hibernate.PropertyNotFoundException:Could not find a getter for ..
- org.hibernate.PropertyNotFoundException: Could not find a getter for XXX
- hibernate出现:org.hibernate.PropertyNotFoundException: Could not find a getter for id in class
- Hibernate错误 Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for pnsame i
- net.sf.hibernate.PropertyNotFoundException
- org.hibernate.PropertyNotFoundException: Could not find a getter for titlse in class com.po.Intro
- org.hibernate.PropertyNotFoundException: Could not find a getter for titlse in class com.po.Intro异常
- org.hibernate.PropertyNotFoundException: Could not find a getter for empDeptId in class
- org.hibernate.PropertyNotFoundException Could not find a getter for id in class
- 错误提示:Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for ID
- 手机聊天APP技术开发
- Caffe中的优化方法
- 一小时入门正则表达式
- android Bitmap->BGR字节数组
- java.lang.OutOfMemoryError: GC overhead limit exceeded ECLIPSE解决方法
- org.hibernate.PropertyNotFoundException
- 在web项目中应用shiro
- 常见浏览器内核概述
- Android使用WindowManager在界面添加一个悬浮框
- 大明A+B
- Android基础动画
- windows下搭建Mantis 缺陷管理系统
- JAVA 希尔排序
- 求最大公约数(gcd)