您的位置:首页 > 其它

重建Hibernate的SessionFactory的方法(不重启服务)

2008-10-06 20:59 218 查看
转载请注明出处: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
可以看出已经生效了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: