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)  編輯  收藏 所屬分類: j2eedatabase

          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 | 譚軍
          主站蜘蛛池模板: 临汾市| 辰溪县| 武宁县| 杭锦旗| 长丰县| 天祝| 万年县| 临桂县| 德庆县| 榆中县| 江津市| 阿勒泰市| 历史| 无极县| 延庆县| 盐源县| 烟台市| 南康市| 普格县| 九江县| 衡南县| 武夷山市| 揭阳市| 东台市| 博野县| 竹山县| 含山县| 城固县| 修水县| 阳春市| 长治市| 宜州市| 汝城县| 襄垣县| 新河县| 凌源市| 新民市| 香格里拉县| 炎陵县| 资中县| 辉县市|