Uploaded image for project: 'Hibernate ORM'
  1. HHH-3718

call to id getter initializes proxy when using AccessType( "field" )

    Details

    • Type: Improvement
    • Status: Closed
    • Priority: Major
    • Resolution: Out of Date
    • Affects Version/s: 3.3.1, 5.2.2
    • Fix Version/s: None
    • Component/s: hibernate-core
    • Labels:
      None
    • Environment:
      hibernate 3.3.1, hibernate annotations 3.4.0, running on windows, linux and solaris, using sybase 15
    • Last commented by a user?:
      true
    • Sprint:

      Description

      Calling getter for id when using AccessType( "field" ) causes proxy initialization.

      In org.hibernate.proxy.proxy.pojo.BasicLazyInitializer there is the code

      			else if ( isUninitialized() && method.equals(getIdentifierMethod) ) {
      				return getIdentifier();
      			}
      

      However, when using field access, the getIdentifierMethod will be null. I fixed this for us by changing DirectPropertyAccessor by adding a Method attribute to the DirectGetter inner class, and looking up the appropriate getter in the constructor. As far as I can tell, getMethod is only used in two places. In the above case, to the get the identity getter and in PojoComponentTupilizer.isMethodOf. This doesn't seem to break anything. I don't know if this is a clean solution, seems a little hacky to me, however, it would be great if the issue could be fixed somehow.

        public static final class DirectGetter implements Getter {
          private final transient Field field;
          private final Class clazz;
          private final String name;
          private Method method;
          DirectGetter(Field field, Class clazz, String name) {
            this.field = field;
            this.clazz = clazz;
            this.name = name;
            try
            {
              BeanInfo beanInfo = Introspector.getBeanInfo( clazz );
              PropertyDescriptor[] pdArray  = beanInfo.getPropertyDescriptors();
              if ( pdArray != null )
              {
                for (PropertyDescriptor pd : pdArray )
                {
                  if ( pd.getName().equals( name ) )
                  {
                    this.method = pd.getReadMethod();
                  }
                }
              }
            }
            catch ( Exception e )
            {
              // ignore
            }
          }
          public Object get(Object target) throws HibernateException {
            try {
              return field.get(target);
            }
            catch (Exception e) {
              throw new PropertyAccessException(e, "could not get a field value by reflection", false, clazz, name);
            }
          }
      
          public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
            return get( target );
          }
      
          public Method getMethod() {
            return method;
          }
          public String getMethodName() {
            return method == null ? null : method.getName();
          }
          public Class getReturnType() {
            return field.getType();
          }
      
          Object readResolve() {
            return new DirectGetter( getField(clazz, name), clazz, name );
          }
      
          public String toString() {
            return "DirectGetter(" + clazz.getName() + '.' + name + ')';
          }
        }
      

        Attachments

        1. hhh-3718.zip
          5 kB
        2. ids.patch
          3 kB
        3. ids.patch
          3 kB

          Issue links

            Activity

              People

              • Votes:
                43 Vote for this issue
                Watchers:
                44 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: