首页 > 高级民工 > Hibernate动态加载时class的加入

Hibernate动态加载时class的加入

2012年12月27日 发表评论 阅读评论

  最近在搞一个模块化的功能,自己写着玩的,最终目的是整合osgi,Hibernate,Spring,Struts等常用框架,并能在模块中动态加入到这些框架中。今天遇到一个Hibernate动态加入时找不到实体类的问题,翻看源码在ReflectHelper中找到答案:

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

在加载类时是通过在当前线程的classLoader中查找类(ClassLoader有隔离机制),所以在动态加载ClassLoader之前需要把当前线程的contextClassLoader设置为我们自己定义的ClassLoader.代码如下:

	Thread.currentThread().setContextClassLoader(loader);//设置当前线程的ContextClassLoader
	ModuleSupporter.hibernateMapping(new File("c:/x3.jar"));

后记:
由于Hibernate本身用了大量反射并且对多个ClassLoade的情况考虑不是很充分,另外动态加入只是加入到Configuration所以需要要单独创建SessionFactory,感觉会浪费资源还有就是多个模块的时候SessionFactory的不同必然会有事务不好控制的问题。

分类: 高级民工 标签: ,
  1. 本文目前尚无任何评论.

点击刷新