[hibernate-issues] [Hibernate-JIRA] Updated: (HHH-3718) call to id getter initializes proxy when using AccessType( "field" )

Gail Badner (JIRA) noreply at atlassian.com
Thu Jan 26 15:44:11 EST 2012


     [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3718?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Gail Badner updated HHH-3718:
-----------------------------

    Pull Requests: https://github.com/hibernate/hibernate-orm/pull/258

> call to id getter initializes proxy when using AccessType( "field" )
> --------------------------------------------------------------------
>
>                 Key: HHH-3718
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3718
>             Project: Hibernate ORM
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 3.3.1
>         Environment: hibernate 3.3.1, hibernate annotations 3.4.0, running on windows, linux and solaris, using sybase 15
>            Reporter: Paul Lorenz
>         Attachments: ids.patch, ids.patch
>
>
> 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 + ')';
>     }
>   }

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list