zoukankan      html  css  js  c++  java
  • 菜鸟学SSH(十八)——Hibernate动态模型+JRebel实现动态创建表

    项目用的是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动态模型,眼下也算是尝试阶段吧。假设各位谁用过或者对动态模型感兴趣欢迎留言交流。



  • 相关阅读:
    设计模式(15)-命令模式
    设计模式(14)-模板方法模式
    设计模式(13)-代理模式
    设计模式(12)-享元模式
    设计模式(3)-工厂方法模式
    微服务(1)-简单初始化项目
    MCMC:Markov Chain&Monte Carlo(二)MH采样和Gibbs采样,MCMC局限性
    MCMC:Markov Chain& Monte Carlo(一)基本cdf采样,rejection采样,Importance采样
    指数族分布:相关概念理解
    matlab隐马尔可夫相关函数简单例子实现(help文档)
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5221078.html
Copyright © 2011-2022 走看看