spring hibernate实现动态替换表名(分表)的方法

  

  

其实最简单的办法就是使用原生sql,如session.createSQLQuery (“sql”),或者使用jdbcTemplate。但是项目中已经使用了hql的方式查询,修改起来又累,风险又大!所以,必须找到一种比较好的解决方案,实在不行再改写吧!经过3天的时间的研究,终于找到一种不错的方法,下面讲述之。

  

  

     /* *   *由hdwang>   & lt; bean id=皊essionFactory”类=" org.springframework.orm.hibernate4。祝辞LocalSessionFactoryBean”;   & lt;属性名=笆菰础眗ef=癲efaultDataSource祝辞& lt;/property>   & lt;属性名=皃ackagesToScan”比;   & lt; list>   & lt; value> com.my.pay.task.entity   & lt; value> com.my.pay.paycms.entity   & lt; value> com.my.pay.data.entity.payincome   & lt;/list>   & lt;/property>   & lt;属性名=癿appingLocations”比;   & lt; list>   & lt; value> classpath *:/hibernate/hibernate-sql.xml   & lt;/list>   & lt;/property>   & lt;属性名=癶ibernateProperties”比;   & lt; props>   & lt;支撑关键=" hibernate.dialect "祝辞org.hibernate.dialect.MySQL5Dialect   & lt;支撑关键=" hibernate.show_sql "祝辞false   & lt;支撑关键=" hibernate.format_sql "祝辞false   & lt;支撑关键=癮uto”祝辞none   & lt; !——开启查询缓存——比;   & lt;支撑关键=" hibernate.cache.use_query_cache "祝辞false   & lt; !——配置二级缓存——比;   & lt;支撑关键=" hibernate.cache.use_second_level_cache "祝辞true   & lt; !——强制Hibernate以更人性化的格式将数据存入二级缓存——比;   & lt;支撑关键=" hibernate.cache.use_structured_entries "祝辞true   & lt; !,Hibernate将收集有助于性能调节的统计数据——比;   & lt;支撑关键=" hibernate.generate_statistics "祝辞false   & lt; !——指定缓存配置文件位置——比;   & lt;支撑关键=" hibernate.cache.provider_configuration_file_resource_path "祝辞/spring/ehcache.xml   & lt;支撑关键=" hibernate.cache.region.factory_class "祝辞org.hibernate.cache.ehcache.EhCacheRegionFactory   & lt;支撑关键=" hibernate.current_session_context_class "祝辞jta   & lt;支撑关键=" hibernate.transaction.factory_class "祝辞org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory   & lt;支撑关键=" hibernate.transaction.manager_lookup_class "祝辞com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup   & lt;/props>   & lt;/property>   & lt;/bean>            公共类LocalSessionFactoryBean HibernateExceptionTranslator延伸   实现FactoryBean      

那其实呢,sessionFactory是LocalSessionFactoryBean对象的一个属性,这点可以在LocalSessionFactoryBean类中可以看的到,至于bean的注入为何是类的属性而非类本身,那是因为它实现了FactoryBean接口.sessionFacotry是由LocalSessionFactoryBean对象配置后生成的。生成后将sessionFactory对象注入到春天了容器,且仅此一个而已,默认单例嘛。
  

  

我们对数据库的操作都是用会话对象,它是由sessionFactory对象生成的。下面是sessionFactory对象的两个方法:

     /* *   * {@link会话}。   * & lt; p/比;   * JDBC连接(s} {@link连接将会得到的   *配置{@link org.hibernate.service.jdbc.connections.spi。根据需要ConnectionProvider}   *执行请求的工作。   *   * @return创建会话。   *   * @throws HibernateException表明问题打开会话;非常罕见。   */公共会话openSession()抛出HibernateException;/* *   *获取当前会话。究竟“当前”的定义   *意味着控制{@link org.hibernate.context.spi。CurrentSessionContext} impl配置   *使用。   * & lt; p/比;   *请注意,向后兼容性,如果一个{@link org.hibernate.context.spi.CurrentSessionContext}   *不是配置但JTA配置这将默认为{@link org.hibernate.context.internal.JTASessionContext}   * impl。   *   * @return当前会话。   *   * @throws HibernateException表明一个问题找到一个合适的当前会话。   */公共会话getCurrentSession()抛出HibernateException;

spring hibernate实现动态替换表名(分表)的方法