项目用的是SSH基础框架,当中有一些信息非常相似,但又不尽同样。假设每个建一个实体的话,那样实体会太多。假设分组抽象,然后继承,又不是特别有规律。鉴于这样的情况。就打算让用户自己配置要加入的字段,然后生成相应的表。

须要动态配置的部分实例:

上图仅仅是一小部分,一个一个组合起来大概有三百多。每一项相应一个实体,显然不好,就算是依照规律归归类还是有不少。于是就想到了在执行期来确定这些东西。開始有尝试过动态编译生成实体类,后来发如今数据存取上都存在问题,由于是后来生成的,所以仅仅能用反射来获取。这样一来无法事先确定类型,也就没法用注入的方式接收前端传过来的数据,也不能向前端提供数据了。

后来决定用Hibernate的动态模型来处理这个问题,可能有的人不是非常了解Hibernate的动态模型,以下我们就来介绍一下。

我们通经常使用实体类来跟表进行映射。当我们须要一个user表的时候,通常都须要写一个相似以下的实体类:

public class User {
private Long id;
private String name;
private String password; // setter、getter...
}

然后用配置文件或注解来描写叙述映射关系,假设使用动态模型的话,则不须要编写实体类,仅仅须要写一个配置文件就可以:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<!-- 此处不须要类名。和包名 -->
<class entity-name="User">
<id name="id" type="java.lang.Long" column="ID">
<generator class="native"/>
</id>
<property name="name" type="java.lang.String" column="name"/>
<property name="password" type="java.lang.String" column="password"/>
</class>
</hibernate-mapping>

然后通过Map进行操作:

session.beginTransaction();
//通过Map映射实体与数据库
Map user = new HashMap();
user.put("name", "动态模型");
user.put("password", "123456");
session.save("User", user);
session.getTransaction().commit();
session.close();

发出的SQL语句:insert into User (name, password) values (?, ?)

有人说动态映射存入数据非常方便。 可是从数据取出数据好像比較难处理。事实上这个问题能够通过事先做好约定来解决。

上一篇博客介绍了JRebel,它能够让Tomcat支持热部署。JRebel+Hibernate动态模型双剑合璧。就能够实现我们动态建表的要求了。

在Spring的配置文件里加入:

<property name="mappingLocations">
<list>
<value>classpath:/com/tgb/entitycfg/*.hbm.xml</value>
</list>
</property>

採用通配符来配置hbm.xml文件。就是为了兼容执行期生成的动态模型配置文件,而JRebel能够检測到配置文件的变化,从而将新增的配置载入进来。须要说明的是JRebel的动态载入属于懒载入,即在你用到改动的东西是,才会将你改动的内容又一次载入进来。

我也是初次使用Hibernate动态模型,眼下也算是尝试阶段吧。假设各位谁用过或者对动态模型感兴趣欢迎留言交流。

菜鸟学SSH(十八)——Hibernate动态模型+JRebel实现动态创建表的更多相关文章

  1. 菜鸟学SSH(八)——Hibernate对象的三种状态

    前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢.说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧.今天就先说说Hibernate对 ...

  2. Mina、Netty、Twisted一起学(十):线程模型

    要想开发一个高性能的TCP服务器,熟悉所使用框架的线程模型非常重要.MINA.Netty.Twisted本身都是高性能的网络框架,如果再搭配上高效率的代码,才能实现一个高大上的服务器.但是如果不了解它 ...

  3. 菜鸟学自动化测试(八)----selenium 2.0环境搭建(基于maven)

    菜鸟学自动化测试(八)----selenium 2.0环境搭建(基于maven) 2012-02-04 13:11 by 虫师, 11419 阅读, 5 评论, 收藏, 编辑 之前我就讲过一种方试来搭 ...

  4. Hibernate连接mysql数据库并自动创建表

    天才第一步,雀氏纸尿裤,Hibernate第一步,连接数据库. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个 ...

  5. Django笔记&教程 6-3 使用模型(models)创建表单(form)

    Django 自学笔记兼学习教程第6章第3节--使用模型(models)创建表单(form) 点击查看教程总目录 本文参考:Forms for models 1 - 初步介绍 很多时候,我们使用的表单 ...

  6. 菜鸟学SSH(十一)——Hibernate之SchemaExport+配置文件生成表结构

    今天说点基础的东西,说说怎样通过SchemaExport跟Hibernate的配置文件生成表结构.事实上方法很easy,仅仅须要两个配置文件,两个Java类就能够完毕. 首先要生成表,得先有实体类,以 ...

  7. 菜鸟学SSH(三)——Struts2国际化自动检测浏览器语言版

    前几天发了一篇Struts国际化的博客——<菜鸟学习SSH(二)——Struts2国际化手动切换版>,有网友提了一个意见,见下图: 于是就有了下面修改的版本: web.xml <?x ...

  8. 菜鸟学SSH(十五)——简单模拟Hibernate实现原理

    之前写了Spring的实现原理,今天我们接着聊聊Hibernate的实现原理,这篇文章只是简单的模拟一下Hibernate的原理,主要是模拟了一下Hibernate的Session类.好了,废话不多说 ...

  9. 菜鸟学SSH(十四)——Spring容器AOP的实现原理——动态代理

    之前写了一篇关于IOC的博客——<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP,换句话说,容器的两大特性就是IOC和AOP. ...

随机推荐

  1. QReadWriteLock读写锁的一点测试(它是逻辑锁,并没有与实物相联系),只有锁住了读,才允许再次读,否则一概不允许

    QReadWriteLock m_lock; void MyWidget::Button1(){ m_lock.lockForRead(); ShowMessage(tr("111" ...

  2. logstash 使用grok正则解析日志

    http://xiaorui.cc/2015/01/27/logstash%E4%BD%BF%E7%94%A8grok%E6%AD%A3%E5%88%99%E8%A7%A3%E6%9E%90%E6%9 ...

  3. Unity doesn't load, no Launcher, no Dash appears

    1. 重新安装 ubuntu-desktop不起作用. Enter the following commands:- Ctrl+Alt+F1 login there by user name and ...

  4. java反射 实例

    首先介绍几个概念: 1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时对象所属的类 2)可以判断运行时对象所具有的成员变量和方法 3)通过反 ...

  5. eclipse ctrl链接设置

    选择[Window]菜单 Preferences ——>General——>Editors——>Text Editors——>Hyperlinking

  6. 第九十六题(编写strcpy 函数)

    96.08 年中兴校园招聘笔试题 1.编写strcpy 函数 已知strcpy 函数的原型是 char *strcpy(char *strDest, const char *strSrc); 当中st ...

  7. 【并查集+拓扑排序】【HDU1811】【Rank of Tetris】

    题意:给你3种关系 A=B,A>B,A<B 问是否排名方式唯一,或者存在矛盾 解 1.读入数据先处理 =号 用并查集的祖先作为代表元素,其他儿子节点都等于跟这个点重叠. 再读入 '< ...

  8. LinQ学习手册

    LinQ : Language Integrated Query(语言集成查询); 1.以统一方式操作各种数据源,减少数据访问的复杂性. 优点在于封装了SQL语句,只对对象进行操作(增删改查),代码量 ...

  9. DoNet开源项目-基于jQuery EasyUI的后台管理系统

    博主在业余时间开发了一个简单的后台管理系统,其中用到了 jQuery EasyUI 框架,上次分享过系统布局,参考文章:jQuery EasyUI 后台管理系统布局分享,目前已完成系统的整体框架的搭建 ...

  10. div滚动与控制

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head&g ...