菜鸟学SSH——Hibernate动态模型+JRebel实现动态创建表

75 篇文章 2 订阅
19 篇文章 111 订阅

项目用的是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/shuijing/entitycfg/*.hbm.xml</value>  
	</list>  
</property>


采用通配符来配置hbm.xml文件,就是为了兼容运行期生成的动态模型配置文件,而JRebel可以检测到配置文件的变化,从而将新增的配置加载进来,需要说明的是JRebel的动态加载属于懒加载,即在你用到修改的东西是,才会将你修改的内容重新加载进来。

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

 

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘水镜

文章写得不错,我要让更多人看到

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值