lunes, 19 de marzo de 2012

ClassNotFoundException: org.hibernate.hql.ast.HqlToken

 Cuando creamos aplicaciones para la web utilizando framework como struts, spring, hibernate ... y otros componentes.. etc. tenemos además que contextualizar todos estos en un entorno comun para que puedan trabajar de forma adecuada, especificamente en el error mencionado como titulo utiliza un contexto que puede no estar bien definido de acuerdo a la plataforma en la que queremos ejecutar la aplicación. por ejemplo una aplicación para tomcat no siempre correrá enmediatamente en un weblogic, y se nos presentara este problema (ClassNotFoundException: org.hibernate.hql.ast.HqlToken) investigando pude dar con la solución.
Este error hace referencia a la forma de traducir las querys de hibernate con ANTLR (herramienta de reconocimiento de lenguaje), para solucionar esto debemos decirle a hibernate que métodos utilizara para efectuar las consultas.

Hibernate posee propiedades que no siempre están declaradas en un contexto de aplicación en algun archivo xml de configuración, una de esas propiedades es miscelanea como se le califica "" debemos ejecutar la siguiente configuración en un entorno spring framework para una aplicación montada en eclipse.( que de paso para esta prueba de concepto estaba integrada con Oracle Weblogic como servidor de aplicaciones) .

en el archivo properties.xml (en la def de la base de datos):

//   <!-- database URL for creating other dbs - used in db-create target --> 
//    <property name="database.admin.url" value="jdbc:${database.type}://${database.host}/template1"/>
//    <property name="database.admin.username" value="postgres"/>
//    <property name="database.admin.password" value="postgres"/>
//    <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
  
//    <property name="hibernate.query.factory_class" value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory"/>
  
//    <property name="database.driver_class" value="org.postgresql.Driver"/>
//    <property name="database.url" value="jdbc:${database.type}://${database.host}/${database.name}?useUnicode=true&amp;amp;characterEncoding=utf-8"/>
//    <property name="database.show_sql" value="true"/>
//    <property name="database.schema" value=""/>


se agrega la linea : //    <property name="hibernate.query.factory_class" value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory"/>

Esto es para que interprete de forma clásica las querys de hibernate.

En el applicationContext-hibernate.xml :

// <property name="hibernateProperties">
//            <props>
//                <prop key="hibernate.dialect">@HIBERNATE-DIALECT@</prop>
              
//                <prop key="hibernate.query.factory_class">@HIBERNATE-TRANSLATOR@</prop>
              
//                <prop key="hibernate.query.substitutions">1</prop>              
//                <!-- Create/update the database tables automatically when the JVM starts up
//                <prop key="hibernate.hbm2ddl.auto">update</prop> -->
//                <!-- Turn batching off for better error messages under PostgreSQL
//                <prop key="hibernate.jdbc.batch_size">0</prop> -->
//            </props>
//        </property>


Se le dice que utilice esa variable como translator.

y por ultimo se incluye en el buid.xml de nuestra app la siguiente declaracion:

//    <!-- List of variables in .properties files that will be replaced at build time -->
//    <filterset id="variables.to.replace">
//        <filter token="APPNAME" value="${webapp.name}"/>
//        <filter token="ENCRYPT-ALGORITHM" value="${encrypt.algorithm}"/>
//        <filter token="ERROR-MAILTO" value="${error.mailTo}"/>
//        <filter token="ERROR-MAILFROM" value="${mail.default.from}"/>
//        <filter token="ERROR-MAILHOST" value="${mail.host}"/>
//        <filter token="ERROR-SERVER" value="${error.server}"/>
//        <filter token="SECURE-LOGIN" value="${secure.login}"/>
//        <filter token="HIBERNATE-DIALECT" value="${hibernate.dialect}"/>
//        <filter token="HIBERNATE-TRANSLATOR" value="${hibernate.query.factory_class}"/>
//    </filterset>

Ahora iniciamos nuestro weblogic, generamos el war con eclipse y lo deployamos en nuestro server por consola web


Saludos y suerte !!