在Hibernate中动态切换Schema

如果你在调用hibernate的时候需要切换scheme怎么办呢。

在oracle中,不同的用户,使用不同的schema.在hibernate的POJO中,会指定了schema

<?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">
<!--
  Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
  <class name="com.csc.poimanager.dao.Poi" table="POI" schema="P_BEIJING">
    <id name="poiId" type="java.lang.Long">
      <column name="POI_ID" precision="10" scale="0" />
      <generator class="increment" />
    </id>
    <property name="cnName" type="java.lang.String">
      <column name="CN_NAME" length="1000" />
    </property>
  </class>
</hibernate-mapping>

上面的代码部分,就指定了Schema.如果在操作的时候想切换Schema.操作如下:

默认的配置<property name="hibernate.default_schema">POI_BEIJING</property>

上面的映射文件改为:

<?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">
<!--
  Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
  <class name="com.csc.poimanager.dao.Poi" table="POI" >
    <id name="poiId" type="java.lang.Long">
      <column name="POI_ID" precision="10" scale="0" />
      <generator class="increment" />
    </id>
    <property name="cnName" type="java.lang.String">
      <column name="CN_NAME" length="1000" />
    </property>
  </class>
</hibernate-mapping>

在操作的,可以用下面的方法来重新build你的SessionFactory

  public static void rebuildSessionFactoryForChangeSchema(String newSchema){
    try {
  Properties p = configuration.getProperties();
      System.out.println("---" + p);
      p.put("hibernate.default_schema", newSchema);
      sessionFactory = configuration.buildSessionFactory();
      System.out.println(" change schema successfully ......... ");
    } catch (Exception e) {
      System.err
          .println("%%%% rebuild session factory failed for changing schema %%%%");
      e.printStackTrace();
    }
  }

如果需要改变Schema,就需要在需要的时候调用此方法

比如在SchemaAction中

   HibernateSessionFactory.rebuildSessionFactoryForChangeSchema("POI_SHANGHAI");
  System.out.println(" change successfully ---");
  PoiDAO pd = new PoiDAO();
    Transaction t =pd.getSession().beginTransaction();
  pd.save(new Poi("jsfjksdf"));
    t.commit();

那么,原来,是向POI_BEIJING中插入数据的,变成了向POI_SHANGHAI中插入一条数据了。

通过这种方法,可以实现在操作不同的Schema的时候实现切换。

问题:此处改变的是静态工厂。所以,会对所有的用户产生影响。如果不想对所有的用户改变,那么可以根据Schema的名称来取得自己对应的SessionFactoy就可以了。

时间: 2024-08-01 16:50:20

在Hibernate中动态切换Schema的相关文章

在Hibernate里面动态切换SChema实现访问不同的数据库的几种方法

需求很简单,相同的操作,比如表结构完全相同,程序也完全相同,但需要根据某些条件,分别向不同的schema做操作. 比如,如果当前处理的是A公司,那么向SchemaA 里面保存数据,如果当前处理的是B公司的,则向SchemaB里面保存数据. 其实就是一套程序,实现后台的动态切换. 我这里提供几种方法,大家自己根据情况考虑,都能实现,注意是实现,不一定适合于正式应用. 方法一: 在Hibernate里面,有一个配置参数,比如下面这个带Schema配置的映射 <?xml version="1.0

android-安卓开发 如何在代码中动态切换fragment加载的布局文件?

问题描述 安卓开发 如何在代码中动态切换fragment加载的布局文件? viewpager和fragment一起用的时候,比如有啊,吧,a,b,c,三页,一开始显示的是a,我想当用户滑到b和c时先显示的是一个loding的圆环进度条,之后再显示这个fragment的内容,请问应该如何做? 解决方案 上面说的是fragment之间的切换,你这个问题直接用view.setVisibility()方法控制进度条隐藏或显示就好了,也可以吧进度条放在Dialog或pupopWindow等当中控制show

如何在wpf中动态切换controltemplate?

问题描述 如何在wpf中动态切换controltemplate? RT 我想实现一个自定义树形控件,想动态切换controltemplate,比如有多个controltemplate,可以动态加载.这种思路可行吗?如果可行该如何实现呢?谢谢~~ 解决方案 MVVM开发的话,通过Style的Tiggers来做,添加DataTrigger,绑定ViewModel的一个属性,改变属性值就可以达到切换模板的目的了.

Spring+Mybatis多数据源配置(四)——AbstractRoutingDataSource实现数据源动态切换

有时候需要在程序中动态切换数据源,那么这个系列的之前的博文所阐述的方法就不再使用了,总不能通过程序更改config.properties文件的dataSource的值,然后再重启web服务器以便加载applicationContext.xml文件.这里讲诉的是如何利用AbstractRoutingDataSource进行数据源动态切换. 首先上applicationContext.xml文件: <?xml version="1.0" encoding="UTF-8&qu

mdi toolbar动态切换-MFC 多文档程序 怎样 动态切换ToolBar

问题描述 MFC 多文档程序 怎样 动态切换ToolBar 我的应用场合是这样的: VS10创建的MDI 多文档程序,有2个文档模板,分别对应View1 和View2 两种视图,View1对应工具条ToolBar1 ,View2对应工具条Toolbar2. 我想实现:View1 激活时,显示ToolBar1: View2激活时,显示ToolBar2. 目前,我在CChildFrame中响应 WM____CHILDACTIVATE 消息,代码如下: void CChildFrame::OnChil

动态切换tableView中的cell的种类

动态切换tableView中的cell的种类 为什么要动态切换tableView中cell的种类呢?如果项目经理不出这种需求,你也就见不到这篇文章了:) 效果: 源码: 首先,你要准备3种cell,直接继承系统的就行了. // // RootViewController.m // ChangeCell // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "RootViewController.h" #import

关于Hibernate中的动态代理是起什么作用的呢?

问题描述 虽然做了下Hibernate的动态代理,但依然还是不能完全搞懂这个动态代理.说是:让主要业务更好的实现,把次要业务交给代理去实现.不知道理解对不对,还请高手们指点一二..谢谢! 解决方案 解决方案二:你可以看看马士兵的动态代理的课程,hibernate中的动态代理可以说是面向切面编程,假如我们的程序是一条线的运行,则他的功能就是在这点上插一束呵呵解决方案三:确实,去找点视频来看看,这样说的话有点太抽线了,

Silverlight4中实现Theme的动态切换

Silverlight一般用来开发一些企业的应用系统,如果用户一直面对同一种风格的页面,时间长了难免厌烦,所以一般都会提供好几种风格及Theme供用户选中,下面就来说一下如何在不重新登录系统的情况下,实现风格的动态切换.我们写一个Demo来说明一下. 新建一个Silverlight的项目,并添加一个默认的站点,先来写一下页面吧,简单起见,只放两个控件,MainPage的代码如下: <UserControl x:Class="SilverlightChangeTheme.MainPage&q

Android中实现动态切换组件背景的操作

 这个也是昨天学习用到的,总结下思路吧,因为这个知识点以后绝对会再次用到. 目的:我要在软件中动态的选择组件背景,系统皮肤,自定义吐司背景等. 实现思路:要用到安卓中的SharedPrefence的功能,在设置里面写一个控件,设置一个点击监听器,点击的时候显示一个Alert选择弹窗,让你进行选择,对这个弹窗再设置一个点击监听器(onItemListener),点击到具体某个的时候,把对应的点击id保存到sahredprefence里面去,这样,其他地方就可以从这里取得设置里选择的值,进行动态个性