]
Vladimir Konkov edited comment on HHH-7084 at 3/12/12 4:31 AM:
---------------------------------------------------------------
According to logic in ClassLoaderServiceImpl it checks classloaders in folowing order:
applicationClassLoader (usualy thread local class loader)
hibernateClassLoader (the loaded of ClassLoaderServiceImpl class)
environmentClassLoader (that is usualy sys class loader)
It means that we first of all check application own classloader. BUT because of calling
default ClassLoader constructor you are implicitly set SYSTEM class as parent and in case
when hibernate located in SYS classloader your classloading logic is broken. Same is
hapens in JBoss 7 and may be in other environments.
Just set parent to null:
{code:title=ClassLoaderServiceImpl.java|borderStyle=solid}
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 );
}
};
}
{code}
Will solved the issue.
was (Author: vladimirfx):
According to logic in ClassLoaderServiceImpl it checks classloaders in folowing
order:
applicationClassLoader (usualy thread local class loader)
hibernateClassLoader (the loaded of ClassLoaderServiceImpl class)
environmentClassLoader (that is usualy sys class loader)
It means that we first of all check application own classloader. BUT because of calling
default ClassLoader constructor you are implicitly set SYSTEM class as parent and in case
when hibernate located in SYS classloader your classloading logic is broken. Same is
hapens in JBoss 7 and may be in other environments.
Just set parent to 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 );
}
};
Will solved the issue.
Caused by: java.lang.ClassCastException: cannot be cast to
org.hibernate.dialect.Dialect
----------------------------------------------------------------------------------------
Key: HHH-7084
URL:
https://hibernate.onjira.com/browse/HHH-7084
Project: Hibernate ORM
Issue Type: Bug
Components: core
Affects Versions: 4.1.0
Environment: Idea 11.0.02, JDK 7, GWT 2.4.0 Dev Mode, Hibernate 4.0.0+
Reporter: Artem V. Navrotskiy
Labels: GWT, hibernate
Attachments: classloader.patch, ClassLoaderServiceImplTest.java,
ClassLoaderServiceImplTest.java
If you run GWT application from JetBrains Idea in Dev Mode, GWT builds custom
ClassLoader.
When Hibernate creates of any object by it's name (Dialect for example), if class
available for SystemClassLoader it's will be created by SystemClassLoader. Not by a
current ClassLoader.
This is due to the fact that the class ClassLoaderServiceImpl$1 uses SystemClassLoader as
parent ClassLoader.
Stacktrace:
javax.persistence.PersistenceException: Unable to build EntityManagerFactory
at
org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914)
at
org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
at
ru.buzzsoft.common.HibernateHelper.createEntityManagerFactory(HibernateHelper.java:180)
at
ru.buzzsoft.delivery.PersistentFactory.getEntityPersonalFactory(PersistentFactory.java:21)
at ru.buzzsoft.delivery.server.api.impl.ContextImpl.<init>(ContextImpl.java:126)
at ru.buzzsoft.delivery.server.api.impl.ContextImpl.<init>(ContextImpl.java:89)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at java.lang.Class.newInstance0(Class.java:372)
at java.lang.Class.newInstance(Class.java:325)
at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:253)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:616)
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:146)
at
org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
at
org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
at
org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71)
at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2273)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2269)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1738)
at
org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:88)
at
org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
... 32 more
Caused by: java.lang.ClassCastException: org.hibernate.dialect.H2Dialect cannot be cast
to org.hibernate.dialect.Dialect
at
org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:73)
... 43 more
--
This message is automatically generated by JIRA.
For more information on JIRA, see: