zhyiwww
          用平實的筆,記錄編程路上的點點滴滴………
          posts - 536,comments - 394,trackbacks - 0
          如果你在調用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就可以了。





          |----------------------------------------------------------------------------------------|
                                     版權聲明  版權所有 @zhyiwww
                      引用請注明來源 http://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2008-12-24 18:24 zhyiwww 閱讀(3836) 評論(5)  編輯  收藏 所屬分類: j2ee 、database

          FeedBack:
          # re: 在hibernate中動態切換Schema
          2008-12-25 08:39 | 一臉大鼻涕
          重新構建SessionFactoy的消耗會不會太大了?  回復  更多評論
            
          # re: 在hibernate中動態切換Schema
          2008-12-25 10:32 | zhyiwww
          我現在也不知道,僅能從功能上去實現項目的需求。  回復  更多評論
            
          # re: 在hibernate中動態切換Schema
          2008-12-25 10:33 | zhyiwww
          不過,我想,可以,根據不同的schema把SessionFactory放在map里面,這樣在用戶切換和訪問的時候能提高一些性能。  回復  更多評論
            
          # re: 在hibernate中動態切換Schema
          2009-08-13 22:23 | Gorden
          不知道在實際項目中有遇到切換用戶的可能沒?  回復  更多評論
            
          # re: 在hibernate中動態切換Schema
          2011-09-15 11:47 | 譚軍
          主站蜘蛛池模板: 班玛县| 西乌珠穆沁旗| 河南省| 丰原市| 旬邑县| 灵宝市| 长宁县| 镇康县| 广饶县| 东阿县| 星子县| 务川| 南召县| 南皮县| 沙坪坝区| 滕州市| 宝鸡市| 崇明县| 永德县| 沁水县| 沅陵县| 石河子市| 许昌市| 潼南县| 玛纳斯县| 高阳县| 苏尼特右旗| 华坪县| 华亭县| 基隆市| 清河县| 南开区| 大同县| 庄浪县| 丁青县| 廉江市| 辽源市| 银川市| 六盘水市| 遂川县| 普兰店市|