Hibernate自定义表单解决方案补遗

参照前面的文章
不过以前的文章无法适用于修改的情况,比如我生成 了一个类,但我修改了类属性又重新生成,怎么办?因为在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;
	}



你可能感兴趣的:(java,thread,xml,Hibernate)