`
love4ajax
  • 浏览: 12193 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

[原创]基于 Hibernate 的自定义表单 实现方案

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

/**
 * @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;
 }
}
分享到:
评论
16 楼 foxgst 2007-09-30  
自定义表单,说的应该是系统运行过程中用户(有一定开发能力的技术人员?)自定义的映射于新创建的POJO(或者新的实体)的表单。
15 楼 Wallian_hua 2007-09-29  
学习了.. 看来个人经验还是不够吖...
期待有更好的文章.
14 楼 braveheartcc 2007-09-24  
楼主 这样 不用更新sessionfactory就可以 实现动态映射了吗
13 楼 wangweij 2007-09-04  
那是要存用户定义的表单.还是表单中的数据?
12 楼 love4ajax 2007-09-04  
wangweij 写道
不好意思.刚没看懂楼主说的.不知道你说的自定义表单具体指的是什么.理解能力有问题:)
就是用户填写的表单不是由程序员预先设计好的,而是有用户自己设计表单。
11 楼 wangweij 2007-09-04  
不好意思.刚没看懂楼主说的.不知道你说的自定义表单具体指的是什么.理解能力有问题:)
10 楼 casheen 2007-09-04  
总共四个对象,Form,Field,FormData,FieldData。其中Form中存放动态表单信息,相当于一个规则;FormData中存放的是由Form这个规则生成表单;Field是动态表单中的字段规则,与动态表单是多对一关联关系,指定字段的类型,长度,最大值,最小值,默认值等;FieldData是由Field这个规则生成的字段信息。
关系如下:
Form   1 ---- n   Field
1|               1|
   |                |
   |                |
n|               n|
FormData  1 ---- n  FieldData
9 楼 casheen 2007-09-04  
我已经做个一个动态表单,现在正在规划实现第二个版本。
我们的思路是,一个Form关联多个Field,分别存放在两张表中。逻辑较复杂,特别是更新字段时比较难以实现,但方案确实可行。
8 楼 wangweij 2007-09-04  
我们上一个项目就是这样做的.后来总结时得出个结果!!!!!! 要struts的Form何用?????????
7 楼 chinapr 2007-09-03  
<br/>
<strong>chenxu 写道:</strong><br/>
<div class='quote_div'>
<p>关于这个问题我非常的有兴趣。早在2005年低的一个项目中我们就遇到了这种需求:系统实用hibernate作为持久层,但是有这种动态建表并访问的需求。当时我就想到了利用Configuration中提供的方法来动态的更新持久化对象。但是因为项目中考虑到这样做的事务 和缓存的问题,以及可能遇到的风险 ,最后还是放弃了这种做法。最后采用了比较可靠的方式:不更新持久化类,利用动态拼装jdbc来实现对动态增加的库表的访问。<br/>
      最后这种做法也效果不错,唯一不足的地方是:因为没有持久化,所以不能利用hibernate的二级缓存,并且在代码中动态拼装了很多sql语句。<br/>
     你的这种做法不知道在具体的项目实践中应用过没有?! 有没有验证过对于事务和缓存的影响!如果都验证过的话,那不失为一个比较好的方案!</p>
</div>
<br/>
<br/>
<br/>
<br/>
我也是用同样的方法来实现.hibernate弄这个是有难度啊!
6 楼 love4ajax 2007-08-27  
测试通过map代替pojo以及运行中加载hbm文件动态生成表,更深入的东西还没来得及研究。
5 楼 wenxiaogen 2007-08-27  
chenxu 写道
不过此典型问题我想在javaeye中的许多大牛中应该有遇到过吧!

    希望有对此问题好的解决方案的朋友给点意见哦?
牛人
4 楼 chenxu 2007-08-27  
不过此典型问题我想在javaeye中的许多大牛中应该有遇到过吧!

    希望有对此问题好的解决方案的朋友给点意见哦?
3 楼 chenxu 2007-08-27  
<p>关于这个问题我非常的有兴趣。早在2005年低的一个项目中我们就遇到了这种需求:系统实用hibernate作为持久层,但是有这种动态建表并访问的需求。当时我就想到了利用Configuration中提供的方法来动态的更新持久化对象。但是因为项目中考虑到这样做的事务 和缓存的问题,以及可能遇到的风险 ,最后还是放弃了这种做法。最后采用了比较可靠的方式:不更新持久化类,利用动态拼装jdbc来实现对动态增加的库表的访问。<br/>
      最后这种做法也效果不错,唯一不足的地方是:因为没有持久化,所以不能利用hibernate的二级缓存,并且在代码中动态拼装了很多sql语句。<br/>
     你的这种做法不知道在具体的项目实践中应用过没有?! 有没有验证过对于事务和缓存的影响!如果都验证过的话,那不失为一个比较好的方案!</p>
2 楼 love4ajax 2007-08-23  
有兴趣的朋友可以留下意见,继续交流一下。
1 楼 huozhe 2007-08-23  

   强烈支持楼主~!

相关推荐

    hibernate自定义查询

    在Hibernate中,自定义查询是扩展其功能的重要方式,能够帮助我们实现更复杂的数据库交互需求。本文将深入探讨Hibernate自定义查询的相关知识点。 一、Hibernate HQL查询 Hibernate Query Language (HQL) 是...

    hibernate + 自定义标签分页

    本例中,我们探讨的是如何结合Struts、Hibernate和自定义标签实现分页功能,这是一种常见的优化用户界面体验的技术,特别是对于数据量大的查询结果。 1. **分页原理** 分页的基本思想是将大量数据分成多个小部分,...

    基于hibernate的简单留言本

    基于Hibernate的简单留言本是一个基本的Web应用程序,它使用Hibernate作为数据持久化层,用户可以通过该系统进行留言、查看留言以及回复等操作。这个系统展示了如何在实际项目中应用Hibernate来管理数据库交互。 ...

    Hibernate使用——自定义数据类型

    本篇文章将深入探讨如何在Hibernate中实现自定义数据类型。 首先,我们需要理解Hibernate是如何处理数据类型的。默认情况下,Hibernate使用Java的标准数据类型来映射数据库中的列。例如,Integer对应INT,String...

    用Hibernate实现领域对象的自定义字段

    本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对Hibernate核心概念的理解以及自定义类型的应用。 首先,我们需要了解Hibernate的核心概念。Hibernate主要通过配置文件(hibernate.cfg.xml)...

    自定义表单使用

    通过自定义表单,用户可以根据自己的业务需求设计出符合特定场景的数据输入和展示界面,无需编程知识即可实现。Java语言因其跨平台性和丰富的库支持,成为实现这种功能的理想选择。 在描述中提到的"在IE浏览器中...

    基于SpringMVC+Hibernate实现的在线购物商城.zip

    基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+...

    基于Struts 2和Hibernate的Blog实现

    **基于Struts 2和Hibernate的Blog实现** 在IT领域,构建一个博客系统是常见的实践项目,用于学习和展示Web开发技术。本项目利用Struts 2和Hibernate这两个流行的Java框架,实现了一个基本的博客系统。Struts 2是MVC...

    基于hibernate_validator的异步表单校验框架依赖文件

    基于Hibernate Validator的异步表单校验框架则提供了一种高效且灵活的方式来实现这一功能。Hibernate Validator是JSR 303/349标准的参考实现,它为Java应用程序提供了强大的数据验证功能。 **一、Hibernate ...

    自定义标签实现的分页

    本篇文章将详细讲解如何利用Hibernate框架的自定义标签来实现分页功能,供开发者们参考和借鉴。 首先,我们要了解Hibernate的基本概念。Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发人员使用面向对象...

    论坛系统项目(Struts 2+Hibernate+Spring实现)

    论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts...

    简要分析Java的Hibernate框架中的自定义类型

    使用自定义类型时,你需要在实体类的属性上使用`@Type`注解,指定自定义类型的实现类,使得Hibernate在操作这些属性时能够调用我们定义的转换逻辑。 例如,如果你有一个自定义日期时间类型,可以这样使用: ```java...

    基于Hibernate的网络成绩管理系统设计与实现

    ### 基于Hibernate的网络成绩管理系统设计与实现 #### 一、引言 随着教育信息化的快速发展,传统的手工管理成绩的方式已经无法满足现代教育的需求。特别是在实施学分制的背景下,学生可以根据个人兴趣和特长自由...

    Hibernate Validation自定义注解校验的实现

    Hibernate Validation自定义注解校验的实现 Hibernate Validation自定义注解校验的实现是指在Hibernate Validation框架中,使用自定义的注解来实现特定的校验逻辑。在本文中,我们将通过示例代码,详细地介绍如何...

    仅供参考 JAVA动态表单设计,自定义表单,自定义数据

    以下将详细介绍Java动态表单设计、自定义表单以及自定义数据的相关知识点。 1. **Java动态表单设计**: 动态表单设计是指在运行时根据业务需求生成和修改表单的机制。在Java中,这通常涉及到后端服务器处理动态...

    JSP+Hibernate实现留言板

    **JSP+Hibernate实现留言板详解** 在Web开发中,创建一个功能完善的留言板系统是一项常见的任务。这个系统通常涉及用户交互、数据存储以及后端逻辑处理。在这个案例中,我们使用了Java服务器页面(JSP)作为视图层...

    JPA + Hibernate 3 CRUD操作历史审计日志的解决方案

    这篇博客"JPA + Hibernate 3 CRUD操作历史审计日志的解决方案"将深入探讨如何实现这一需求。 首先,我们需要理解JPA和Hibernate的基础概念。JPA定义了一组用于持久化Java对象的API,它允许开发者通过面向对象的方式...

    Hibernate留言板

    综上所述,这个项目是一个典型的基于Hibernate和Spring框架的学生管理系统。它不仅涉及到了ORM框架的使用,还包含了一定程度上的系统架构设计,如DAO层、Service层的设计,以及关系数据库的实体映射等。通过这些知识...

    Spring+Hibernate实现增删改查的两种方法

    本文将深入探讨如何利用Spring与Hibernate整合,通过两种不同的方式来实现这些基本操作:HibernateTemplate和HibernateDaoSupport。 **一、HibernateTemplate** HibernateTemplate是Spring提供的一个方便的类,它...

    基于struts+hibernate的bbs

    【基于Struts+Hibernate的BBS论坛】 在Web开发领域,Struts和Hibernate是两个非常重要的框架,它们分别处理表现层(Presentation Layer)和持久层(Persistence Layer)的问题。Struts是一个MVC(Model-View-...

Global site tag (gtag.js) - Google Analytics