2011-11-16 23 views
5

Hola y gracias por ver ;-)Hibernate ClassCastException en GWT alojado modo sólo

Nuestro problema/error es:

javax.persistence.PersistenceException: [PersistenceUnit: PUname] Unable to build EntityManagerFactory 
... 
Caused by: org.hibernate.HibernateException: Could not instantiate dialect class 
... 
Caused by: java.lang.ClassCastException: org.hibernate.dialect.MySQLDialect cannot be cast to org.hibernate.dialect.Dialect 
... 

(ver traza completa en la parte inferior)

Ocurre en una aplicación web basada en GWT que utiliza las siguientes tecnologías:

  • Maven
  • Hibernate EntityManager/JPA
  • Guice
  • GWT
  • GWT-P
  • GWT Maven Plugin
  • ...

El hecho a destacar es que lo hace el trabajo en Tomcat. Solo en modo de desarrollo, también conocido como modo alojado (con Jetty), utilizando GWT Maven Plugin (con objetivo gwt: ejecutar), obtenemos ClassCastException. Estábamos jugando con las dependencias de Hibernate sin suerte (agregando hibernate-validator y/o hibernate-jpa-2.0-api). La excepción ClassCastException se inicia al iniciar JPA antes de que se utilice realmente algún servicio. Por cierto: JPA se configura utilizando Guice:

install(new JpaPersistModule("PUname")); 
    filter("/*").through(PersistFilter.class); 

puede valer la pena mencionar que la desactivación de la configuración dialecto (en persistence.xml) crea otro ClassCastException también de APP inicio:

javax.persistence.PersistenceException: [PersistenceUnit: dsmgmt] Unable to build EntityManagerFactory 
... 
Caused by: org.hibernate.HibernateException: Unable to instantiate specified TransactionFactory class [org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory] 
... 
Caused by: java.lang.ClassCastException: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory cannot be cast to org.hibernate.engine.transaction.spi.TransactionFactory 
... 

¿Por qué romper en el embarcadero? ¿Qué podría estar causando o cómo puede ser reparado?

del archivo: META-INF/persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="PUname" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <class>our.test.class</class> 
     <properties> 
      <property name="hibernate.connection.username" value="user"/> 
      <property name="hibernate.connection.password" value="pass"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
      <property name="hibernate.connection.url" value="jdbc:mysql://machine:3306/db"/> 
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

Nuestros vasos de la aplicación de web:

 445.288 antlr-2.7.7.jar 
     150.774 antlr-runtime-3.1.3.jar 
     4.467 aopalliance-1.0.jar 
     57.963 classmate-0.5.4.jar 
     575.389 commons-collections-3.2.1.jar 
     52.543 commons-exec-1.1.jar 
     59.590 commons-fileupload-1.2.2.jar 
     163.151 commons-io-2.1.jar 
     284.220 commons-lang-2.6.jar 
     313.898 dom4j-1.6.1.jar 
     131.929 dsmgmt-shared-0.1-SNAPSHOT.jar 
    1.006.424 ehcache-core-2.4.3.jar 
     710.492 guice-3.0.jar 
     36.998 guice-assistedinject-3.0.jar 
     27.633 guice-persist-3.0.jar 
     65.012 guice-servlet-3.0.jar 
    5.004.997 gwt-servlet-2.3.0.jar 
     28.339 gwtp-dispatch-server-0.6.jar 
     17.184 gwtp-dispatch-server-guice-0.6.jar 
     30.402 gwtp-dispatch-shared-0.6.jar 
     81.426 hibernate-commons-annotations-4.0.0.Final.jar 
    4.347.499 hibernate-core-4.0.0.CR6.jar 
     127.259 hibernate-ehcache-4.0.0.CR6.jar 
     471.832 hibernate-entitymanager-4.0.0.CR6.jar 
     102.661 hibernate-jpa-2.0-api-1.0.1.Final.jar 
     366.592 hibernate-validator-4.2.0.Final.jar 
     70.928 jandex-1.0.3.Final.jar 
     644.148 javassist-3.12.1.GA.jar 
     2.497 javax.inject-1.jar 
     60.542 jboss-logging-3.1.0.CR1.jar 
     11.209 jboss-transaction-api_1.1_spec-1.0.0.Final.jar 
     859.016 jna-3.2.3.jar 
     213.781 jsch-0.1.44-1.jar 
     281.579 jsoup-1.6.1.jar 
     481.535 log4j-1.2.16.jar 
     789.885 mysql-connector-java-5.1.18.jar 
    1.351.561 org.eclipse.jgit-1.0.0.201106090707-r.jar 
     601.287 pd4ml-3.80b1.jar 
     149.846 pd4ml-ss-css-3.80b1.jar 
     25.962 slf4j-api-1.6.4.jar 
     9.748 slf4j-log4j12-1.6.4.jar 
     743.673 sqljet-1.0.4.jar 
     172.023 stringtemplate-3.2.jar 
    1.889.196 svnkit-1.3.5.jar 
     251.371 trilead-ssh2-build213-svnkit-1.3-patch.jar 
     47.433 validation-api-1.0.0.GA.jar 
     109.318 xml-apis-1.0.b2.jar 

El StackTrace completo:

javax.persistence.PersistenceException: [PersistenceUnit: PUname] Unable to build EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:916) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:887) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) 
    at com.google.inject.persist.jpa.JpaPersistService.start(JpaPersistService.java:94) 
    at com.google.inject.persist.PersistFilter.init(PersistFilter.java:77) 
    at com.google.inject.servlet.FilterDefinition.init(FilterDefinition.java:114) 
    at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:98) 
    at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172) 
    at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:593) 
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140) 
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220) 
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513) 
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:468) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.handler.RequestLogHandler.doStart(RequestLogHandler.java:115) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.Server.doStart(Server.java:222) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:672) 
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509) 
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068) 
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811) 
    at com.google.gwt.dev.DevMode.main(DevMode.java:311) 
Caused by: org.hibernate.HibernateException: Could not instantiate dialect class 
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:82) 
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:64) 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:142) 
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:81) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:160) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:133) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71) 
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2259) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2255) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1724) 
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:76) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:907) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:887) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) 
    at com.google.inject.persist.jpa.JpaPersistService.start(JpaPersistService.java:94) 
    at com.google.inject.persist.PersistFilter.init(PersistFilter.java:77) 
    at com.google.inject.servlet.FilterDefinition.init(FilterDefinition.java:114) 
    at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:98) 
    at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172) 
    at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:593) 
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140) 
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220) 
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513) 
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:468) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.handler.RequestLogHandler.doStart(RequestLogHandler.java:115) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.Server.doStart(Server.java:222) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:672) 
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509) 
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068) 
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811) 
    at com.google.gwt.dev.DevMode.main(DevMode.java:311) 
Caused by: java.lang.ClassCastException: org.hibernate.dialect.MySQLDialect cannot be cast to org.hibernate.dialect.Dialect 
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:73) 
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:64) 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:142) 
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:81) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:160) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:133) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71) 
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2259) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2255) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1724) 
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:76) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:907) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:887) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) 
    at com.google.inject.persist.jpa.JpaPersistService.start(JpaPersistService.java:94) 
    at com.google.inject.persist.PersistFilter.init(PersistFilter.java:77) 
    at com.google.inject.servlet.FilterDefinition.init(FilterDefinition.java:114) 
    at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:98) 
    at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172) 
    at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:593) 
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140) 
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220) 
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513) 
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:468) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.handler.RequestLogHandler.doStart(RequestLogHandler.java:115) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.Server.doStart(Server.java:222) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:672) 
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509) 
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068) 
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811) 
    at com.google.gwt.dev.DevMode.main(DevMode.java:311) 

Saludos, Alexander

Respuesta

1

También me he enfrentado a ese problema. Después de algunas investigaciones, descubrí que es un comportamiento especial de la carga de clases de Google Eclipse Plugin + Jetty + Hibernate.

Detalles: De hecho durante la carrera o la aplicación de eclipsar las libs se cargan dos veces: primero a instancia de la aplicación cargador de clases y segundo tiempo para cargador de clases applciation web de embarcadero. Hibernate tiene una observación de carga especial durante la carga de dialectos sql en la comprobación de la jerarquía del cargador de clases y, como resultado, las instancias son diferentes.

Solución: solución no real de este caso, pero me las he arreglado para manejarlo con debuging GWT applcation en un servidor externo Run As -> Web Applcaition (ejecuta en un servidor externo)

creo que sirve

0

Aplicando this patch a org.hibernate.service.classloading.internal.ClassLoaderServiceImpl.java como se describe en HHH-7084 lo hizo por mí (básicamente anulando esa clase con mi propia versión al igual que con el jetty launcher for GWT hosted mode to get the JNDI stuff to work).

La respuesta es muy probable que sea demasiado tarde para que sea valiosa para Alexander (@ user845767), pero puede ser útil para otra persona que viene a buscar una solución.

0

usando hibernate 4.1.4 - que tiene este problema parchado - resuelto el problema completamente

Cuestiones relacionadas