[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-1131) setting classloader in CGLIB class generators

Stéphane Routhiau (JIRA) noreply at atlassian.com
Tue Sep 18 09:25:15 EDT 2007


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-1131?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_28125 ] 

Stéphane Routhiau commented on HHH-1131:
----------------------------------------

We have the same problem with a dynamic classloader implementation. 

Please fix ! 

> setting classloader in CGLIB class generators
> ---------------------------------------------
>
>                 Key: HHH-1131
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-1131
>             Project: Hibernate3
>          Issue Type: Improvement
>          Components: core
>    Affects Versions: 3.0.5
>         Environment: Hibernate 3.0.5, Oracle 10
>            Reporter: Moshe Ben Shoham
>
> In my application I am loading plug-ins mapping documents and persistent classes from jars using some UrlClassLoaders (one per plugin). I then set the threadContextClassLoader to be the CompositeClassLoader that holds all those UrlClassLoaders. Everything works fine until I add a proxy to one of the mapping document (I simplified the names a little): 
> <hibernate-mapping> 
>    <subclass 
>       name="myplugin.MyExtension" 
>       discriminator-value="3" 
>       proxy="myplugin.IMyExtension"
>       extends="core.MyBasicClass" 
>    > 
>       <join table="MY_EXTENSION"> 
>               <key column="ENTITY_ID"/> 
>           <property name="extraNumData" column="EXTRA_NUM_DATA" type="long"/> 
>           <property name="extraStrData" column="EXTRA_STR_DATA" type="string"/> 
>       </join> 
>    </subclass > 
> </hibernate-mapping> 
> See below the exception I get. 
> Hibernate uses net.sf.cglib.proxy.Enhancer as the class generator in CGLIBLazyInitializer.getProxyFactory(). Now, it seeme like CGLIB allows customizing the ClassLoader used by its class generators using the method net.sf.cglib.core.AbstractClassGenerator.setClassLoader() (Enhancer extends AbstractClassGenerator). But, it doesn't seem like it is possible to use it in Hibernate, because this is how the Enhancer is used in CGLIBLazyInitializer.getProxyFactory() : 
> return (Factory) Enhancer.create( 
>   (interfaces.length==1) ? persistentClass : null, 
>   interfaces, 
>   NULL_METHOD_INTERCEPTOR 
> ); 
> If I replace it with the following code, it works: 
> Enhancer e = new Enhancer(); 
> e.setSuperclass((interfaces.length==1) ? persistentClass : null); 
> e.setInterfaces(interfaces); 
> e.setCallback(NULL_METHOD_INTERCEPTOR); 
> e.setClassLoader(Thread.currentThread().getContextClassLoader()); // this is the addition! 
> return (Factory)e.create(); 
> Is there any other way I can do it (I know I can implement my own persister, but it seems like there's too much code that needs to be overridden...)? 
> Is there any planned enhancement regarding this issue?
> Full stack trace of any exception that occurs: 
> CGLIB Enhancement failed: com.octavian.fas.domain.business.BusinessTransaction 
> net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null 
> at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:236) 
> at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:373) 
> at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:281) 
> at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:640) 
> at org.hibernate.proxy.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:94) 
> at org.hibernate.proxy.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:42) 
> at org.hibernate.tuple.PojoTuplizer.buildProxyFactory(PojoTuplizer.java:144) 
> at org.hibernate.tuple.AbstractTuplizer.<init>(AbstractTuplizer.java:83) 
> at org.hibernate.tuple.PojoTuplizer.<init>(PojoTuplizer.java:54) 
> at org.hibernate.tuple.TuplizerLookup.create(TuplizerLookup.java:47) 
> at org.hibernate.tuple.EntityMetamodel.<init>(EntityMetamodel.java:218) 
> at org.hibernate.persister.entity.BasicEntityPersister.<init>(BasicEntityPersister.java:400) 
> at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:104) 
> at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55) 
> at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:211) 
> at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1005) 
> at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:777) 
> at org.springframework.orm.hibernate3.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:703) 
> at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1058) 
> at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:363) 
> at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:226) 
> at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:147) 
> at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:269) 
> at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:318) 
> at com.octavian.sma.analytical.batch.SpringHelper.init(SpringHelper.java:77) 
> at com.octavian.sma.analytical.batch.SpringHelper.<init>(SpringHelper.java:38) 
> at com.octavian.sma.analytical.batch.dailynongrouping.DailyNonGroupingAnalyticalBatch.initSpringHelper(DailyNonGroupingAnalyticalBatch.java:44) 
> at com.octavian.sma.analytical.batch.AnalyticalBatch.run(AnalyticalBatch.java:58) 
> at com.octavian.sma.analytical.batch.dailynongrouping.DailyNonGroupingAnalyticalBatch.main(DailyNonGroupingAnalyticalBatch.java:29) 
> Caused by: java.lang.reflect.InvocationTargetException 
> at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source) 
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
> at java.lang.reflect.Method.invoke(Method.java:585) 
> at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:373) 
> at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:218) 
> ... 28 more 
> Caused by: java.lang.NoClassDefFoundError: myplugin/IMyBusinessTransactionExtension 
> at java.lang.ClassLoader.defineClass1(Native Method) 
> at java.lang.ClassLoader.defineClass(ClassLoader.java:620) 
> ... 33 more

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

       




More information about the hibernate-issues mailing list