Responder al comentario
WebLogic, Hibernate y el ClassNotFoundException org.hibernate.hql.ast.HqlToken
Recientemente he tenido que lidiar con el problema mencionado en el título de este artículo y que a continuación describiré, una aplicación Java web desarrollada utilizando Struts 2, Hibernate 3, Spring 3, desplegada en un contenedor de aplicación WebLogic 10 y el resultado es...
org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken
Este problema se presenta debido a una incompatibilidad de versiones en el classpath de la aplicación. Sucede que Hibernate utiliza el proyectco ANTLR para la carga de entidades (clases mapeadas) especificadas a través de String y para la resolver las consultas HQL. Por ejemplo, el siguiente código ocasiona la excepción citada.
Query query =
this.getSessionFactory().getCurrentSession().createQuery("from User u");
Posibles "soluciones"
Cambiar la clase traductora de consultas HQL.
En realidad está no es una solución, es un workaround, tendría que verse como un "mientras arreglo el problema de fondo". Sin embargo es la más factible, si no tenemos el control del WebLogic, ya que se modifica como parte de la configuración de Hibernate en nuestra aplicación. Para ello debemos cambiar la siguiente propiedad de Hibernate.<property name="hibernate.query.factory_class" value="org.hibernate.hql.ast.ASTQueryTranslatorFactory"/>Para dejarla de la siguiente manera:
<property name="hibernate.query.factory_class" value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory"/>Adicional a que no es del todo una solución, esta aproximación tiene en contra el hecho de que este traductor (
ClassicQueryTranslatorFactory) presenta problemas con Enumerations.
Modificar el CLASSPATH del WebLogic.
Esta solución requiere editar el script de carga del WebLogicstartWebLogic para agrega al inicio del mismo el jar de ANTLR.
CLASSPATH="$ANTLR_HOME/antlr-VERSION.jar:${SAVE_CLASSPATH}"
Donde VERSION es el númnero de la versión del ANTLR que requiere el Hibernate que estemos utilizando.El problema con esta solución, es que cómo desarrolladores no siempre tenemos el control del ApplicationServer en el cual se despliegan nuestras aplicaciones mucho menos tenemos el poder de realizar modificaciones de este tipo.
Posiblemente existan otras soluciones que se ajusten mejor a diferentes escenarios, estas 2 son las que he podido comprobar.
