hibernate

Hibernate y su empleo de Javassist

Hibernate emplea las librerías Javassist (Java Programming Assistant) para realizar tareas de reflexión java (java reflection), por ejemplo, para construir objetos definidos como lazy que se obtienen posteriormente a la ejecución de una consulta. Las clases construidas, aunque respetan el interfaz de la clase original, tienen diferente nombre de clase, formando parte del nombre la palabra ‘javassist’, por ejemplo una clase de nombre ‘Item’ formada con javassist puede pasar a llamarse ‘Item_$$_javassist_165’. Esto a veces conduce a errores ya que si se comparan los nombres de clase de un objeto, por ejemplo, en el método ‘equals’ de una clase,  los nombres serán diferentes.

Hoy me ha ocurrido esto al emplear un elemento de JSF, concretamente el ‘h:selectOneMenu‘, en el atributo ‘value‘ de este elemento estaba asignado un objeto obtenido mediante javassist, al compararlo con la colección de elementos disponibles en dicho elemento ‘h:selectOneMenu‘ ninguno era coincidente, cuando realmente si que debería haberlo. Esto era debido a que en la implementación de jsf  ‘jsf-impl-1.2_04.jar‘, el método, ‘MenuRenderer.renderOption‘, responsable de marcar el elemento de la colección de valores disponibles como seleccionado (‘selected‘) hace una comprobación en la que se asegura de que la clase del objeto especificado en el atributo ‘value‘, sea del mismo tipo que el de la colección (‘selectItems‘). Al tratarse el objeto del atributo ‘value’ de un objeto javassist, y los de la colección al ser del tipo original, el elemento ‘h:selectOneMenu‘ no funciona correctamente y por consiguiente no selecciona ningún valor (‘selected‘).