zhyiwww
          用平實的筆,記錄編程路上的點點滴滴………
          posts - 536,comments - 394,trackbacks - 0
          <2008年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          -------------------------------------------
          崇尚原創精神,
          文章歡迎轉載,
          請您注明出處,
          在此特別聲明。
          版權所有@zhyiwww
          引用鏈接
          http://www.aygfsteel.com/zhyiwww

          --------------------------------------------

          常用鏈接

          留言簿(33)

          隨筆分類(626)

          朋友的博客

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1559926
          • 排名 - 11

          最新評論

          閱讀排行榜

          評論排行榜

          如果你在調用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 閱讀(3844) 評論(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 | 譚軍
          主站蜘蛛池模板: 鹤壁市| 石楼县| 上饶县| 芒康县| 铜梁县| 桦甸市| 乐都县| 龙海市| 资兴市| 甘孜县| 布尔津县| 广安市| 白水县| 牡丹江市| 甘肃省| 山丹县| 麻阳| 正蓝旗| 睢宁县| 右玉县| 秦皇岛市| 稷山县| 盐城市| 大厂| 三穗县| 聊城市| 双鸭山市| 宁蒗| 永春县| 阿荣旗| 宜川县| 安乡县| 昆山市| 博罗县| 苏尼特右旗| 正镶白旗| 长寿区| 峨山| 图们市| 上思县| 泽库县|