[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-7084) Caused by: java.lang.ClassCastException: cannot be cast to org.hibernate.dialect.Dialect

Vladimir Konkov (JIRA) noreply at atlassian.com
Mon Mar 12 05:29:48 EDT 2012


    [ https://hibernate.onjira.com/browse/HHH-7084?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=45910#comment-45910 ] 

Vladimir Konkov commented on HHH-7084:
--------------------------------------

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: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list