参照前面的文章
不过以前的文章无法适用于修改的情况,比如我生成 了一个类,但我修改了类属性又重新生成,怎么办?因为在classloader已经载入这个类的情况下,你重写了这个class文件
然后再通过classloader.loadClass 来重新加载这个类,是无效的,classloader会认为是重复的导入
解决方案是直接告诉hibernate,修改后的class是个什么样子的
参照前面文章的测试代码
POBuildUtil util = new POBuildUtil();
util.build(rc.getClassName(),"E:\\cpc\\source\\cooperateCore\\com\\mit\\test\\Person.class",list);
//实例化一个person
Object person = Class.forName("com.mit.test.Person").newInstance();//hbmcls.newInstance();
//开始生成hbm.xml
FreemarkerRender render = new FreemarkerRender();
render.render(rc, Templates.TEMPLATE_HIBERNATE3, "E:\\cpc\\source\\cooperateCore\\com\\mit\\test\\person.hbm.xml");
URL url = this.getClass().getResource("/com/mit/test/person.hbm.xml");
config.addURL(url);
//更新hibernate.cfg.xml
HibernateUtil.updateHbmCfg( this.getClass().getResource("/com/mit/cooperate/core/hibernate/hibernate.cfg.xml"), "com/mit/test/person.hbm.xml");
util.build(rc.getClassName(),"E:\\cpc\\source\\cooperateCore\\com\\mit\\test\\Person.class",list);
上面这一段实际是返回了一个class的,这个class就是最后的class结果,我们要防止hibernate自己通过Thread.currentThread().getContextClassLoader() 或则class.forName
来获取更新的class(因为这个做法是无效的),那么唯一的办法就是把更新后的classs设置给他
Class cls = util.build(rc.getClassName(),"E:\\cpc\\source\\cooperateCore\\com\\mit\\test\\Person.class",list);
.....
getConfig().addURL(url);
HibernateUtil.updateHbmCfg(cfgfile, hbmurl);
PersistentClass model = config.getClassMapping(cls.getClassName());
model.setClassName(ns.getClass().getName());
model.setProxyInterfaceName(ns.getClass().getName());
model.setEntityClass(cls );
通过设置 PersistentClass 的EntityClass属性就可以达到这个目的
PersistentClass 中代码如下
public void setEntityClass(Class arg)
{
this.objClass = arg;
}