[hibernate-issues] [Hibernate-JIRA] Created: (HHH-3603) Hibernate custome classloader

Behrang Javaherian (JIRA) noreply at atlassian.com
Thu Nov 13 23:43:15 EST 2008


Hibernate custome classloader
-----------------------------

                 Key: HHH-3603
                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3603
             Project: Hibernate Core
          Issue Type: New Feature
    Affects Versions: 3.3.0.GA
            Reporter: Behrang Javaherian


We are trying to use hibernate in a OSGi like kind of environment. We have a code module that creates the session factory. We want to be able to add classes to session factory and recreated the session factory as needed. But hibernate is always using the current class loader which cause class cast exception if we try to add model classes from child bundles (which has their own class loader). To overcome this issue we had to patch the hibernate internal ReflectHelper and change the classForNameMethod to this:
return PlugableClassFinder.getInstance().classForName(name);
and here is the code for PlugableClassFinder class: 

public class PlugableClassFinder {

    private Set<ClassLoader> classLoaders = new HashSet<ClassLoader>();

    public Class classForName(String name) throws ClassNotFoundException {
        try {
			ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
			if ( contextClassLoader != null ) {
				return contextClassLoader.loadClass(name);
			}
		}
		catch ( Throwable t ) {
		}
        try {
            return Class.forName(name);
        } catch (ClassNotFoundException e) {
        }

        //now look into the registerred class loaders
        for (ClassLoader classLoader : classLoaders) {
            try {
                return classLoader.loadClass(name);
            } catch (ClassNotFoundException e) {

            }
        }
        throw new ClassNotFoundException("Cannot find class: " + name);
    }

    public void registerClassLoader(ClassLoader classLoader) {
        classLoaders.add(classLoader);
    }

    public void deregisterClassLoader(ClassLoader classLoader) {
        classLoaders.remove(classLoader);
    }

    private static final PlugableClassFinder instance = new PlugableClassFinder();

    public static PlugableClassFinder getInstance() {
        return instance;
    }
}

Now every bundle will register its class loader with PlugableClassFinder class.

Maybe hibernate should either allow plugging new class loaders to resolve classes or provide a hook o an interface that we can implement to replace the internal class resolving mechanism. For the moment our approach if working for us.

Regards
Behrang Javaherian
http://www.beyondng.com

-- 
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