Hello,

Just tried my first application with Hibernate and SAPDB (using middlegen
plugin release 3) and encountered one bug (or maybe feature): suppose you
have table with column "N_VALUE" (SAPDB keeps everything in uppercase). So
property name becomes "nValue", getter becomes "getNValue()". Reflection
code in class net.sf.hibernate.util.ReflectHelper.getterMethod() does
following:

----------------------------------------------------------------------------
----------------------------------------------
        private static Method getterMethod(Class theClass, String
propertyName) {
                Method[] methods = theClass.getDeclaredMethods();
                for (int i=0; i<methods.length; i++) {
                        // only carry on if the method has no parameters
                        if(methods[i].getParameterTypes().length==0) {
                                // try "get"
                                if( (methods[i].getName().length() > 3) &&
methods[i].getName().startsWith("get") ) {
                                        String testStdMethod =
Introspector.decapitalize( methods[i].getName().substring(3) );
                                        String testOldMethod =
methods[i].getName().substring(3);
                                        if(
testStdMethod.equals(propertyName)
                            || testOldMethod.equals(propertyName) )
                        return methods[i];
                                }

                                // if not "get" then try "is"
                                if( (methods[i].getName().length() > 2) &&
methods[i].getName().startsWith("is") ) {
                                        String testStdMethod =
Introspector.decapitalize( methods[i].getName().substring(2) );
                                        String testOldMethod =
methods[i].getName().substring(2);
                                        if(
testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName) )
return methods[i];
                                }
                        }
                }
                return null;
        }
----------------------------------------------------------------------------
----------------------------------------------

and Introspector.decapitalize("getNValue".substring(3)) returns "NValue"
(!?!) and of course "nValue".equals("NValue") is false. So we get exception
during execution.

My fix was following:

...
        if( (methods[i].getName().length() > 3) &&
methods[i].getName().startsWith("get") ) {
                String testStdMethod = Introspector.decapitalize(
methods[i].getName().substring(3) );
                String testOldMethod = methods[i].getName().substring(3);
                String methodName = "get"
                            + Character.toUpperCase(propertyName.charAt(0))
                            + (propertyName.length() > 1 ?
propertyName.substring(1) : "");
                                        if(
testStdMethod.equals(propertyName)
                            || testOldMethod.equals(propertyName)
                            || methodName.equals(methods[i].getName()))
                        return methods[i];
        }
...

and the same in setterMethod(). 
Is this fixed allready in hibernate 2.1 ?

Greetings,
Donatas




-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?   SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/
_______________________________________________
hibernate-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/hibernate-devel

Reply via email to