最近开发的一个系统,需要在不更改代码和重启系统的情况下提供对用户自动建表的支持,由于系统应用了hibernate,所以在建表同时也要建立持久化对象以及对这些对象注册,采用的oracle9i 。
建立class->生成hbm.xml->在Hibernate'config里面注册持久化类->通知SessionFactory持久化类的新增
1 准备
首先准备基础数据,我建立了几个类来对生成的表和属性做描述 这些描述都将作为传输传递给class生成方法和hbm.xml的生成方法
RenderClass 描述要生成的实体类 属性如下
2 生成class
采用ASM 生成
3 生成hbm.xml
生成这种事情,当然是交给模板了,我这里用的是Freemarker,在这里,我要感谢freemarker的开发组,感谢webwork 感谢XXCMS系统对freemarker以及其他模板语言的大力推广,,感谢。。。。(省略100字)
模板嘛,肯定不仅仅是应用在web环境的,看看源代码下的freemarker.cache包,恩,不错,freemarker团队确实是有一定“野心”的 首先是渲染的实现
Java代码
- package com.mit.cooperate.core.asm.render;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.PrintWriter;
- import java.io.StringWriter;
- import javax.servlet.ServletContext;
- import com.mit.cooperate.core.util.Assistant;
- import freemarker.cache.ClassTemplateLoader;
- import freemarker.template.Configuration;
- import freemarker.template.ObjectWrapper;
- import freemarker.template.SimpleHash;
- import freemarker.template.Template;
- import freemarker.template.TemplateExceptionHandler;
- /**
- * freeMarker模板渲染
- * @author courser.tijichen
- */
- public class FreemarkerRender implements Render{
- private Configuration templateconfig;
- public FreemarkerRender()
- {
- this.initialize();
- }
- /**
- * 初始化freemarker配置
- *
- */
- public void initialize()
- {
- try
- {
- if (templateconfig==null)
- {
- templateconfig = new Configuration();
- templateconfig.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
- templateconfig.setObjectWrapper(ObjectWrapper.DEFAULT_WRAPPER);
- templateconfig.setTemplateLoader(new ClassTemplateLoader(this.getClass(),"/"));
- templateconfig.setTemplateUpdateDelay(1200);
- templateconfig.setDefaultEncoding("gb2312");
- templateconfig.setLocale(new java.util.Locale("zh_CN"));
- templateconfig.setNumberFormat("0.##########");
- }
- }
- catch (Exception e)
- {}
- }
- /**
- * 渲染
- *
- */
- public void render(RenderClass target,String template,String outpath)
- {
- try
- {
- StringWriter writer = new StringWriter();
- Template tl = templateconfig.getTemplate(
- template,
- templateconfig.getLocale());
- SimpleHash root = new SimpleHash();
- root.put("entity", target);
- tl.process(root, writer);
- Assistant.createNewFile(outpath);
- FileOutputStream fos = new FileOutputStream(outpath);
- PrintWriter pwriter = new PrintWriter(fos);
- pwriter.write(writer.toString());
- pwriter.close();
- fos.close();
- }
- catch (Exception ex)
- {
- ex.printStackTrace();
- }
- }
- }