转载请注明出处:http://blog.csdn.net/sunyujia/
声明:本方法没有进行过除如下测试用例外的任何测试,不保证其稳定性,重建SessionFactory是非常危险的,本文只在于研究和学习。
没有深入研究过hibernate后台的机制,只是为了帮助论坛上的网友解决一个实际的问题,看了下Configuration类的源码,发现是protected的,写了个类继承它,改为public后,测试通过,本来没想到这么简单,不过暂时来看确实简单。不好意思发表,鉴于任何网络资源都会有益于人,还是发出来了。共广大程序员百度搜之。
本方法适合动态修改数据库表结构。例如提供给用户自定义表单功能。
- package com.syj.domain.test;
- import java.io.File;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- import com.syj.domain.User;
- /**
- * <p>
- * Title: 重新创建SessionFactory的测试类
- * </p>
- *
- * <p>
- * Copyright: 转载请注明出处http://blog.csdn.net/sunyujia/
- * </p>
- *
- * @author 孙钰佳
- * @main sunyujia@yahoo.cn
- * @date Oct 6, 2008 8:38:11 PM
- */
- public class ResetHbmTest {
- /**
- * Description: 测试用例
- *
- * @param args
- * @throws Exception
- * @blog ht tp://blog.csdn.net/sunyujia/
- * @mail sunyujia@yahoo.cn
- * @since:Oct 6, 2008 8:38:11 PM
- */
- public static void main(String[] args) throws Exception {
- HibernateConfiguration configuration = new HibernateConfiguration();
- configuration.configure("/hibernate.cfg.xml");
- SessionFactory sessionFactory = configuration.buildSessionFactory();
- Session session = sessionFactory.openSession();
- session.beginTransaction();
- User u1 = new User();
- session.save(u1);
- session.getTransaction().commit();
- session.refresh(u1);
- System.out.println("user Id:" + u1.getId() + " name:" + u1.getName());
- sessionFactory.close();
- testReplaceXml();// 改变pojo xml文件
- configuration.reset();// 重置
- configuration.configure("/hibernate.cfg.xml");
- sessionFactory = configuration.buildSessionFactory();// buildSessionFactory
- session = sessionFactory.openSession();
- session.beginTransaction();
- User u2 = new User();
- session.save(u2);
- session.getTransaction().commit();
- session.refresh(u2);
- System.out.println("user Id:" + u2.getId() + " name:" + u2.getName());
- }
- /**
- *
- * Description:测试修改User.hbm.xml ,为了简单没考虑太多 简单替换
- *
- * @throws Exception
- * @mail sunyujia@yahoo.cn
- * @since:Oct 6, 2008 8:55:28 PM
- */
- public static void testReplaceXml() throws Exception {
- File file = new File(User.class.getResource("User.hbm.xml").getFile());
- String userHbmXml = org.apache.commons.io.FileUtils.readFileToString(
- file, "UTF-8");
- userHbmXml = userHbmXml.replaceAll("(select 1)", "(select 2)");
- org.apache.commons.io.FileUtils.writeStringToFile(file, userHbmXml);
- }
- }
- class HibernateConfiguration extends Configuration {
- public HibernateConfiguration() {
- super();
- }
- public void reset() {
- super.reset();// 关键在这里,这个方法是protected的通过继承转换为public
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <!-- ht tp://blog.csdn.net/sunyujia/ -->
- <class name="com.syj.domain.User" table="Syj_User" schema="dbo" catalog="pubs">
- <id name="id" type="java.lang.Integer">
- <column name="id" />
- <generator class="identity" />
- </id>
- <property name="name" type="java.lang.String">
- <formula>(select 1)</formula>
- </property>
- </class>
- </hibernate-mapping>
测试结果如下
user Id:38 name:1
user Id:39 name:2
可以看出已经生效了。