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.blogjava.net/zhyiwww   
|----------------------------------------------------------------------------------------|
posted on 2008-12-24 18:24 zhyiwww 阅读(3820) 评论(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 | 谭军

只有注册用户登录后才能发表评论。


网站导航: