[原创]基于 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更新数据库。

[code]
/**
* @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;
}
}
[/code]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值