`
帅子
  • 浏览: 78184 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

很久之前写的一篇关于自定表单的文章

阅读更多
很久之前写的一篇关于自定表单的文章 http://www.iteye.com/topic/108474 ,按照此方案完成的自定义表单模块已运用于多个系统。

申明:本方案只是初步的解决思路,供大家参考、讨论。
关于自定义表单网上讨论的很多,个人比较偏向于基于Hibernate的解决方式,原因很简单,如果能够将用户自定义的字段信息通过Hibernate的方式存储,那么具备了Hibernate所带来的一切方便,比如:跨数据库等等。
但是有难度:
1、我们通常是先写一个静态的POJO,然后把它的属性映射到数据库表,那么,在字段不确定的情况下,如果把这些不确定的字段映射到数据库呢?当然可以通过cglib或javassist等等字节码工具动态生成class文件。
2、我们知道Hibernate是在服务器启动的时候,根据hbm映射文件创建表,那么在我们启动时候并不知道表信息的时候,如果在运行时,创建表呢?
第一个问题答案:
我们不一定要做POJO到数据库的映射,Hibernate的实体类型也可以是xml文档、Map,也就是说我们可以用户的表单信息做为xml文档或则Map提交给Hibernate处理。
第二个问题答案:
通过分析Hibernate源代码,我们可以在服务器运行中,请求Hibernate动态创建表,代码如下:
从 SessionFactory中拿到配置信息(不要去创建新的实例),增加HBM映射文件到Configuration ,请求Hibernate更新数据库。

Java代码
/** 
* @author Li Tonggang 
* @email love4ajax@gmail.com 
*/ 
public class CustomAction extends BaseAction{  
   
public String execute() throws MappingException, IOException{  
  SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor) Service.getService("sessionFactory");  
  LocalSessionFactoryBean localSessionFactory = (LocalSessionFactoryBean) Service.getService("&sessionFactory");  
  // 从localSessionFactory拿到配置信息Configuration ,并且增加HBM映射文件到Configuration   
  Configuration config = localSessionFactory.getConfiguration();  
  Resource mappingLocation = new ClassPathResource("custom.hbm.xml");  
        config.addInputStream(mappingLocation.getInputStream());  
       // 从SessionFactory中拿到属性配置信息  
        Settings settings = sessionFactory.getSettings();  
          
        //   请求 Hibernate 创建表  
        if ( settings.isAutoUpdateSchema() ) {  
             new SchemaUpdate( config, settings ).execute( false, true );  
        }  
      return super.SUCCESS;  
}  

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics