Exception in GWT Dev Mode + Spring 3.1 + Hibernate 4.0.1



我有一个GWT+Hibernate+JPA+Spring配置文件,可以使用Spring 3.0。.x + Hibernate 3.6.x。当我升级到Spring 3.1和Hibernate 4.0时,抛出了以下异常:

Hibernate 4和Spring 3.1是否有任何已知的不兼容性?

<>以前org.springframework.beans.factory。在类路径资源[- inf/application-context.xml]中定义名称为"entityManagerFactory"的bean创建错误:init方法调用失败;嵌套异常是javex .persistence. persistenceexception: [PersistenceUnit: myPu]无法构建EntityManagerFactoryorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java: 1455)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java: 519)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java: 456)在1.美元org.springframework.beans.factory.support.AbstractBeanFactory getobject (AbstractBeanFactory.java: 294)org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java: 225)org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java: 291)org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java: 193)org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java: 567)org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java: 913)org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java: 464)org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext (ContextLoader.java: 384)org.springframework.web.context.ContextLoader.initWebApplicationContext (ContextLoader.java: 283)org.springframework.web.context.ContextLoaderListener.contextInitialized (ContextLoaderListener.java: 111)org.mortbay.jetty.handler.ContextHandler.startContext (ContextHandler.java: 543)org.mortbay.jetty.servlet.Context.startContext (Context.java: 136)org.mortbay.jetty.webapp.WebAppContext.startContext (WebAppContext.java: 1220)org.mortbay.jetty.handler.ContextHandler.doStart (ContextHandler.java: 513)org.mortbay.jetty.webapp.WebAppContext.doStart (WebAppContext.java: 448)com.google.gwt.dev.shell.jetty.JettyLauncher WebAppContextWithReload.doStart美元(JettyLauncher.java: 468)org.mortbay.component.AbstractLifeCycle.start (AbstractLifeCycle.java: 39)org.mortbay.jetty.handler.HandlerWrapper.doStart (HandlerWrapper.java: 130)org.mortbay.jetty.handler.RequestLogHandler.doStart (RequestLogHandler.java: 115)org.mortbay.component.AbstractLifeCycle.start (AbstractLifeCycle.java: 39)org.mortbay.jetty.handler.HandlerWrapper.doStart (HandlerWrapper.java: 130)org.mortbay.jetty.Server.doStart (Server.java: 222)org.mortbay.component.AbstractLifeCycle.start (AbstractLifeCycle.java: 39)com.google.gwt.dev.shell.jetty.JettyLauncher.start (JettyLauncher.java: 672)com.google.gwt.dev.DevMode.doStartUpServer (DevMode.java: 509)com.google.gwt.dev.DevModeBase.startUp (DevModeBase.java: 1068)com.google.gwt.dev.DevModeBase.run (DevModeBase.java: 811)com.google.gwt.dev.DevMode.main (DevMode.java: 311)原因:javax.persistence.PersistenceException: [PersistenceUnit: naftPu] Unable to build EntityManagerFactoryorg.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory (Ejb3Configuration.java: 914)org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory (Ejb3Configuration.java: 889)org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory (HibernatePersistence.java: 73)org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory (LocalContainerEntityManagerFactoryBean.java: 257)org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet (AbstractEntityManagerFactoryBean.java: 310)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java: 1514)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java: 1452)…30多造成原因:org.hibernate.service.spi.ServiceException: cannot to create requested service [org.hibernate.service.jdbc.connections.spi.ConnectionProvider]org.hibernate.service.internal.AbstractServiceRegistryImpl.createService (AbstractServiceRegistryImpl.java: 187)org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService (AbstractServiceRegistryImpl.java: 150)org.hibernate.service.internal.AbstractServiceRegistryImpl.getService (AbstractServiceRegistryImpl.java: 131)org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess (JdbcServicesImpl.java: 234)org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure (JdbcServicesImpl.java: 91)org.hibernate.service.internal.StandardServiceRegistryImpl.configureService (StandardServiceRegistryImpl.java: 75)org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService (AbstractServiceRegistryImpl.java: 159)org.hibernate.service.internal.AbstractServiceRegistryImpl.getService (AbstractServiceRegistryImpl.java: 131)org.hibernate.cfg.SettingsFactory.buildSettings (SettingsFactory.java: 71)org.hibernate.cfg.Configuration.buildSettingsInternal (Configuration.java: 2270)org.hibernate.cfg.Configuration.buildSettings (Configuration.java: 2266)org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java: 1735)在org.hibernate.ejb.EntityManagerFactoryImpl。(EntityManagerFactoryImpl.java: 84)org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory (Ejb3Configuration.java: 904)…36更多原因:org.hibernate.HibernateException: Could not instantiate connection provider [org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider]org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider (ConnectionProviderInitiator.java: 190)org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator.initiateService (ConnectionProviderInitiator.java: 112)org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator.initiateService (ConnectionProviderInitiator.java: 54)org.hibernate.service.internal.StandardServiceRegistryImpl.initiateService (StandardServiceRegistryImpl.java: 69)org.hibernate.service.internal.AbstractServiceRegistryImpl.createService (AbstractServiceRegistryImpl.java: 177)…49更多由于:java.lang.ClassCastException: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider不能强制转换为org.hibernate.service.jdbc.connections.spi.ConnectionProviderorg.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider (ConnectionProviderInitiator.java: 187)…这是我的application-context.xml配置的一部分:

<bean id="mainDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="url" value="***manually deleted***" />
<property name="username" value="myschema" />
<property name="password" value="myschema" />
<property name="initialSize" value="1" />
<property name="maxActive" value="4" />
<property name="maxIdle" value="-1" />
<property name="maxWait" value="10000" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" p:persistenceUnitName="myPu">
<property name="dataSource" ref="mainDataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" p:showSql="true" p:generateDdl="true"
p:database="ORACLE" p:databasePlatform="org.hibernate.dialect.Oracle10gDialect" />
</property>
<property name="jpaPropertyMap">
<map merge="true">
<entry key="hibernate.archive.autodetection" value="class" />
<entry key="hibernate.format_sql" value="false" />
<entry key="hibernate.hbm2ddl.auto" value="false" />
<entry key="hibernate.default_schema" value="myschema" />
</map>
</property>
</bean>

persistence . xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">
<persistence-unit name="myPu" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
</persistence-unit>
</persistence>

此问题在Hibernate 4.1.4中修复。


我有同样的问题,它似乎与Jetty类加载器(GWT插件使用Jetty作为托管模式),GWT插件和Hibernate(尽管它显然也会与其他库一起出现)有关。

它类似于Hibernate bug Report中提到的bug,但是在我们的例子中,我们是通过GWT插件运行它,它会导致ConnectionProvider的ClassCastException。

bug报告中提到的修复应该可以修复这个特定的问题。

对于org.hibernate.service.classloading.internalClassLoaderServiceImpl,通过构造函数将父节点设置为null:

this.classClassLoader = new ClassLoader(null) {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
for ( ClassLoader loader : classLoadingClassLoaders ) {
try {
return loader.loadClass( name );
}
catch (Exception ignore) {
}
}
throw new ClassNotFoundException( "Could not load requested class : " + name );
}
};

删除/lib目录下的ejb3-persistence.jar;它与hibernate 4中的hibernate-jpa-2.0-api-1.0.1. final .jar冲突。在遇到这个问题后,我实现了在Openshift环境上托管GWT, Hibernate 4, Spring 3.1.1应用程序https://openshift.redhat.com/app/

我认为您不需要在persistence.xml中设置<provider>org.hibernate.ejb.HibernatePersistence</provider>。查看文档

最新更新