hibernate想跨库查询,在网上看了些资料,说是用spring创建两个sessionFactory,还是有些不太明白,希望高手能给说的明白点,小弟分不够了麻烦了。。

解决方案 »

  1.   

    一套数据库配置对应一个sessionFactory实例,多个sessionFactory实例即可对应多个数据库(多套配置),需要哪个数据库的连接会话,就问对应的sessionFactory实例所要。
    如果楼主比较了解jdbc和hibernate应该不难理解,虽然可能没人告诉我们可以这么用,但自己应该能想到。
      

  2.   


    LZ可以看看SessionFactory是如何被创建的 这样的话你就明白了我一直都用智能ABC..
      

  3.   

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
    <bean id="CRMDataSource"
    class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/crm"></property>
    </bean>
    <bean id="SALEDataSource"
    class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/sale"></property>
    </bean>
    <bean id="CRMSessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="CRMDataSource"></property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.dialect">
    org.hibernate.dialect.Oracle9Dialect
    </prop>
    </props>
    </property>
    <property name="mappingResources">
    <list>
    <value>com/CRM/ORM/BasDict.hbm.xml</value>
    <value>com/CRM/ORM/Credit.hbm.xml</value>
    <value>com/CRM/ORM/Satisfy.hbm.xml</value>
    <value>com/CRM/ORM/Grade.hbm.xml</value>
    <value>com/CRM/ORM/CstService.hbm.xml</value>
    <value>com/CRM/ORM/Customer.hbm.xml</value>
    <value>com/CRM/ORM/CstLost.hbm.xml</value>
    <value>com/CRM/ORM/CstActivity.hbm.xml</value>
    <value>com/CRM/ORM/CstLinkman.hbm.xml</value>
    <value>com/CRM/ORM/Product.hbm.xml</value>
    <value>com/CRM/ORM/Orders.hbm.xml</value>
    <value>com/CRM/ORM/OrdersLine.hbm.xml</value>
                                     <value>com/CRM/ORM/SalPlan.hbm.xml</value>
                             <value>com/CRM/ORM/SalChance.hbm.xml</value>
    </list>
    </property>
    </bean>
    <bean id="SALESessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="SALEDataSource"></property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.dialect">
    org.hibernate.dialect.Oracle9Dialect
    </prop>
    </props>
    </property>
    <property name="mappingResources">
    <list>
    <value>com/CRM/ORM/Storage.hbm.xml</value>
    <value>com/CRM/ORM/Product.hbm.xml</value>
    <value>com/CRM/ORM/Orders.hbm.xml</value>
    <value>com/CRM/ORM/OrdersLine.hbm.xml</value>
    </list> </property>
    </bean>
    <bean id="CRMTransactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="CRMSessionFactory"></property>
    </bean>
    <bean id="SALETransactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="SALESessionFactory"></property>
    </bean>
    <tx:advice id="CRMAdvice"
    transaction-manager="CRMTransactionManager">
    <tx:attributes>
    <tx:method name="find*" propagation="REQUIRED"
    read-only="true" />
    <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
    </tx:advice>
    <tx:advice id="SALEAdvice"
    transaction-manager="SALETransactionManager">
    <tx:attributes>
    <tx:method name="find*" propagation="REQUIRED"
    read-only="true" />
    <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
    </tx:advice>
    <aop:config>
    <aop:pointcut id="daopt"
    expression="execution(* com.CRM.dao.CommonDAO.*(..))" />
    <aop:advisor advice-ref="CRMAdvice" pointcut-ref="daopt" />
    </aop:config>
    <aop:config>
    <aop:advisor advice-ref="SALEAdvice" pointcut-ref="daopt" />
    </aop:config>
    <bean id="DAO" class="com.CRM.dao.CommonDAO">
    <property name="sessionFactory" ref="CRMSessionFactory"></property>
    <property name="map">
    <map>
    <entry key="crm" value-ref="CRMSessionFactory"></entry>
    <entry key="sale" value-ref="SALESessionFactory"></entry>
    </map>
    </property>
    </bean> <!-- 注入bo-->
    <bean id="biz" class="com.CRM.bo.SalPlanManager">
    <property name="dao" ref="DAO"></property>
    </bean> <bean id="baseDataImpl" class="com.CRM.bo.BaseDataImpl">
    <property name="dao" ref="DAO"></property>
    </bean>
    <bean id="reportImpl" class="com.CRM.bo.ReportImpl">
    <property name="dao" ref="DAO"></property>
    </bean>
    <bean id="customer" class="com.CRM.bo.CustomerBizImpl">
    <property name="dao" ref="DAO"></property>
    </bean>

    <bean id="serviceManagerBiz" class="com.CRM.bo.ServiceManager">
    <property name="cstServiceDao" ref="DAO"></property>
    </bean>
    <bean name="/cstService"
    class="com.CRM.struts.action.CstServiceAction">
    <property name="serviceManager" ref="serviceManagerBiz"></property>
    </bean>


    <bean name="/cust" class="com.CRM.struts.action.CustomerAction">
    <property name="customerBiz" ref="customer"></property>
    </bean>
    <bean name="/cstLinkman"
    class="com.CRM.struts.action.CstLinkmanAction">
    <property name="customerBiz" ref="customer"></property>
    </bean>
    <bean name="/cstActivity"
    class="com.CRM.struts.action.CstActivityAction">
    <property name="customerBiz" ref="customer"></property>
    </bean>
    <bean name="/orders" class="com.CRM.struts.action.OrdersAction">
    <property name="customerBiz" ref="customer"></property>
    </bean>
    <bean name="/cstLost" class="com.CRM.struts.action.CstLostAction">
    <property name="customerBiz" ref="customer"></property>
    </bean>
    <bean name="/baseData"
    class="com.CRM.struts.action.BaseDataAction">
    <property name="baseDataImpl" ref="baseDataImpl"></property>
    </bean>
    <bean name="/report" class="com.CRM.struts.action.ReportAction">
    <property name="reportImpl" ref="reportImpl"></property>
    </bean>
    <bean id="daoAdvice" class="com.CRM.interceptor.DAOInterceptor"></bean>
    <aop:config>
    <aop:advisor pointcut-ref="daopt" advice-ref="daoAdvice" />
    </aop:config><!-- task -->
    <!--<bean id="cstLostTask" class="com.CRM.timer.CstLostTask">
    <property name="customerBiz" ref="customer"></property>
    </bean>
    <bean id="methodInvokingTask" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
    <property name="targetObject" ref="cstLostTask">
    </property>
    <property name="targetMethod">
    <value>saveCstLost</value>
    </property>
    </bean>
    <bean id="scheduleTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
    <property name="delay">
    <value>1000</value>
    </property>
    <property name="period">
    <value>2000</value>
    </property>
    <property name="timerTask">
    <ref local="methodInvokingTask"/>
    </property>
    </bean>
    <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
    <property name="scheduledTimerTasks">
    <list>
    <ref local="scheduleTask"/>
    </list>
    </property>
    <property name="daemon">
    <value>true</value>
    </property>

    </bean> -->
    <!--注入action-->
    <bean name="/salchance"
    class="com.CRM.struts.action.SalAction">
    <property name="bo" ref="biz"></property>
    </bean> <bean name="/salPlan" class="com.CRM.struts.action.SalPlanAction">
    <property name="bo" ref="biz"></property>
    </bean>

    </beans>以前写的 现在自己也不会写了  做了一年的c/s开发 都不会B/S了 不知道对你有用不咯
      

  4.   

    建两个 .cfg.xml文件,各写不同的配置
      

  5.   

    跨库查询可简单分两种情况:
    一是,不同表的跨库查询,二是,同一张的跨库查询;对于第一种情况可以为Dao手动配置sessionFactory,即不要继承Hibernate的HibernateDaoSupport类对于第二种情况就需要动态切换sessionFactory了,具体可参考 Spring多数据源解决方案  ;
    http://www.phome.asia/forum/thread/17857.html
      

  6.   

    试试用类似 oracle 的 dblink 来达成你的需求,无需在 hibernate 上下功夫,毕竟主要还是针对一个数据吧。