Hibernate实体命名Bug

来源:互联网 发布:id是什么软件 编辑:程序博客网 时间:2024/06/07 03:14

Hiberante和java Bean两者之间是由hbm.xml和get、set进行关联。但java Bean中的property属性的名字却有一个需要注意的小点,那就是类似于sName这种已单个字符小写开头,后接首字母大写的驼峰命名。在Hibernate中的BasicPropertyAccessor类中的getterMethod方法里的testStdMethod、testOldMethod两者和propertyName都不相等,在进行reflect反射时,属性名没有匹配到,从而直接continue跳过属性,那么在后期的java Bean的赋值时,抛出sName属性的getter方法没有找到异常。 其中Introspector.decapitalize是将methodName.substring(3)中的getSName进行字符串截取后的大小写转换。但是Introspector.decapitalize存在的异常是当首字母大写时,则不进行大小写转换,这中问题,不知是Hibernate故意为之还是无意导致,个人感觉是一个Bug。

 private static Method getterMethod(Class theClass, String propertyName)    {        Method methods[] = theClass.getDeclaredMethods();        for(int i = 0; i < methods.length; i++)        {            if(methods[i].getParameterTypes().length != 0)                continue;            String methodName = methods[i].getName();            String testStdMethod;            String testOldMethod;            if(methodName.startsWith("get"))            {                testStdMethod = Introspector.decapitalize(methodName.substring(3));                testOldMethod = methodName.substring(3);                if(testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName))                    return methods[i];            }            if(!methodName.startsWith("is"))                continue;            testStdMethod = Introspector.decapitalize(methodName.substring(2));            testOldMethod = methodName.substring(2);            if(testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName))                return methods[i];        }        return null;    }
原创粉丝点击