重建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
可以看出已经生效了。
声明:本方法没有进行过除如下测试用例外的任何测试,不保证其稳定性,重建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
可以看出已经生效了。
相关文章推荐
- 重启IIS服务的方法
- win7重启 MySQL服务丢失解决方法
- spring配置hibernate的sessionFactory的几种方法
- Hibernate、Hibernate4获取SessionFactory对象方法的变化
- hibernate5.x 版本中创建SessionFactory的思路与方法
- 重启Zabbix服务提示缺少libmysqlclient.so.18解决方法
- Hibernate5.1 sessionFactory获取方法改变
- [JAVA]修改Java文件不用重启Tomcat服务的方法
- 将hibernate的SessionFactory交给spring管理——东方标准(专注IT、服务中国)续……
- Sybase ASE12.5重建存在用户库的master(master库异常,尝试其他方法不能正常启动服务后)
- Hibernate中获取SessionFactory的方法
- [JAVA]修改Java文件不用重启Tomcat服务的方法
- Hibernate的 SessionFactory,Configuration,Query ,Criteria接口简介,及Query的查询方法
- windows下重启mysql服务的方法
- 重启Erlang Socket服务时,报出{error, eaddrinuse}错误的解决方法
- 修改Java文件不用重启Tomcat服务的方法
- linux系统重启httpd服务报错的解决方法
- hibernate使用SessionFactory的时候用单例和JUnit里的创建方法
- Hibernate4.3.1创建SessionFactory方法
- Hibernate5.1 SessionFactory获取方法