zhyiwww
          用平實(shí)的筆,記錄編程路上的點(diǎn)點(diǎn)滴滴………
          posts - 536,comments - 394,trackbacks - 0
          如果你在調(diào)用hibernate的時(shí)候需要切換scheme怎么辦呢。
          在oracle中,不同的用戶,使用不同的schema.在hibernate的POJO中,會(huì)指定了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.
          如果在操作的時(shí)候想切換Schema.操作如下:

          默認(rèn)的配置
          ??? ??? <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,就需要在需要的時(shí)候調(diào)用此方法

          比如在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中插入數(shù)據(jù)的,變成了向POI_SHANGHAI中插入一條數(shù)據(jù)了。
          ?
          通過這種方法,可以實(shí)現(xiàn)在操作不同的Schema的時(shí)候?qū)崿F(xiàn)切換。

          問題:
          ? 此處改變的是靜態(tài)工廠。所以,會(huì)對(duì)所有的用戶產(chǎn)生影響。如果不想對(duì)所有的用戶改變,那么可以根據(jù)Schema的名稱來取得自己對(duì)應(yīng)的SessionFactoy就可以了。





          |----------------------------------------------------------------------------------------|
                                     版權(quán)聲明  版權(quán)所有 @zhyiwww
                      引用請(qǐng)注明來源 http://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2008-12-24 18:24 zhyiwww 閱讀(3847) 評(píng)論(5)  編輯  收藏 所屬分類: j2eedatabase

          FeedBack:
          # re: 在hibernate中動(dòng)態(tài)切換Schema
          2008-12-25 08:39 | 一臉大鼻涕
          重新構(gòu)建SessionFactoy的消耗會(huì)不會(huì)太大了?  回復(fù)  更多評(píng)論
            
          # re: 在hibernate中動(dòng)態(tài)切換Schema
          2008-12-25 10:32 | zhyiwww
          我現(xiàn)在也不知道,僅能從功能上去實(shí)現(xiàn)項(xiàng)目的需求。  回復(fù)  更多評(píng)論
            
          # re: 在hibernate中動(dòng)態(tài)切換Schema
          2008-12-25 10:33 | zhyiwww
          不過,我想,可以,根據(jù)不同的schema把SessionFactory放在map里面,這樣在用戶切換和訪問的時(shí)候能提高一些性能。  回復(fù)  更多評(píng)論
            
          # re: 在hibernate中動(dòng)態(tài)切換Schema
          2009-08-13 22:23 | Gorden
          不知道在實(shí)際項(xiàng)目中有遇到切換用戶的可能沒?  回復(fù)  更多評(píng)論
            
          # re: 在hibernate中動(dòng)態(tài)切換Schema
          2011-09-15 11:47 | 譚軍
          主站蜘蛛池模板: 东兰县| 特克斯县| 安徽省| 西平县| 大田县| 华坪县| 扎鲁特旗| 门源| 天台县| 宿松县| 东明县| 义乌市| 杭锦旗| 奎屯市| 民丰县| 韩城市| 耒阳市| 东阿县| 商城县| 建德市| 清河县| 泸水县| 尉氏县| 兴安盟| 嵩明县| 乾安县| 罗甸县| 吴桥县| 海南省| 葫芦岛市| 定结县| 扬州市| 龙川县| 弥勒县| 新河县| 无锡市| 义乌市| 舒兰市| 龙井市| 定远县| 旌德县|