`
tangyanbo
  • 浏览: 268552 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring+Hibernate实现动态SessionFactory切换

 
阅读更多

1.配置多个数据源和SessionFactory,并给相应SessionFactory配置事务管理:

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p"
	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" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	<!-- FOR SqlServer-->
	<bean id="SqlServer_DataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
		<property name="url"
			value="url" />
		<property name="username" value="username" />
		<property name="password" value="password" />
	</bean>
	<bean id="SqlServer_SessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
		p:mappingLocations="classpath:/com/entity/*.hbm.xml">
		<property name="dataSource" ref="SqlServer_DataSource" />		
		<property name="hibernateProperties">
			<props>				
				<prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop>
				<prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</prop>				
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
			</props>
		</property>
	</bean>
	<bean id="SqlServer_TransactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="SqlServer_SessionFactory"/>
	</bean>
	
	<!-- FOR Oracle -->
	<bean id="Oracle _DataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">		
		<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@localhost:1521/orcl" />
		<property name="username" value="username" />
		<property name="password" value="password" />
	</bean>
	<bean id="Oracle_SessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" 
		p:mappingLocations="classpath:/com/entity/*.hbm.xml">
		<property name="dataSource" ref="Oracle_DataSource" />		
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop>
				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>				
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
			</props>
		</property>
	</bean>
	<bean id="Oracle_TransactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="Oracle_SessionFactory"/>
	</bean>
	
	
</beans>

 

2. 为SessionFactory配置事务切面

 

<tx:advice id="SqlServer_TxAdvice" transaction-manager="SqlServer_TransactionManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" />
			<tx:method name="find*" read-only="true" />
			<tx:method name="*" propagation="REQUIRED" rollback-for="Exception" />
		</tx:attributes>
	</tx:advice>
	<tx:advice id="Oracle_TxAdvice" transaction-manager="Oracle_TransactionManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" />
			<tx:method name="find*" read-only="true" />
			<tx:method name="*" propagation="REQUIRED" rollback-for="Exception" />
		</tx:attributes>
	</tx:advice>
	
	
	
	<aop:config proxy-target-class="true">  
        <aop:pointcut id="txPointcut" expression="execution(* com.service.*.*(..))"/>        
        <aop:advisor advice-ref="SqlServer_TxAdvice" pointcut-ref="txPointcut" order="1"/> 
        <aop:advisor advice-ref="Oracle_TxAdvice" pointcut-ref="txPointcut" order="2"/> 
    </aop:config>
 

3. 配置一个动态的SessionFactory:

 

<bean id="sessionFactory" class="com.DynamicSessionFactory"/> 

 

4. 定义DynamicSessionFactory实现接口SessionFactory:

 

public class DynamicSessionFactory implements SessionFactory ,ApplicationContextAware{
	
	private static final long serialVersionUID = 1L;

	private ApplicationContext applicationContext;
	
	private SessionFactory getSessionFactory(String name) {
		return (SessionFactory) applicationContext.getBean(name);
	}
        //根据当前线程的SessionFactoryName获取SessionFactory
	private SessionFactory getSessionFactory() {
		return getSessionFactory(ThreadLocalUtil.
				.getSessionFactoryName());
	}

	public Reference getReference() throws NamingException {
		return getSessionFactory().getReference();
	}

	

	public Session openSession() throws HibernateException {
		return getSessionFactory().openSession();
	}

	public Session openSession(Interceptor interceptor)
			throws HibernateException {
		return getSessionFactory().openSession(interceptor);
	}

	public Session openSession(Connection connection) {
		return getSessionFactory().openSession(connection);
	}

	public Session openSession(Connection connection, Interceptor interceptor) {
		return getSessionFactory().openSession(connection,interceptor);
	}

	public Session getCurrentSession() throws HibernateException {
		return getSessionFactory().getCurrentSession();
	}

	public StatelessSession openStatelessSession() {
		return getSessionFactory().openStatelessSession();
	}

	public StatelessSession openStatelessSession(Connection connection) {
		return getSessionFactory().openStatelessSession(connection);
	}

	public ClassMetadata getClassMetadata(Class entityClass) {
		return getSessionFactory().getClassMetadata(entityClass);
	}

	public ClassMetadata getClassMetadata(String entityName) {
		return getSessionFactory().getClassMetadata(entityName);
	}

	public CollectionMetadata getCollectionMetadata(String roleName) {
		return getSessionFactory().getCollectionMetadata(roleName);
	}

	public Map getAllClassMetadata() {
		return getSessionFactory().getAllClassMetadata();
	}

	public Map getAllCollectionMetadata() {
		return getSessionFactory().getAllCollectionMetadata();
	}

	public Statistics getStatistics() {
		return getSessionFactory().getStatistics();
	}

	public void close() throws HibernateException {
		getSessionFactory().close();
	}

	public boolean isClosed() {
		return getSessionFactory().isClosed();
	}

	public Cache getCache() {
		return getSessionFactory().getCache();
	}

	public void evict(Class persistentClass) throws HibernateException {
		getSessionFactory().evict(persistentClass);
	}

	public void evict(Class persistentClass, Serializable id)
			throws HibernateException {
		getSessionFactory().evict(persistentClass, id);
	}

	public void evictEntity(String entityName) throws HibernateException {
		getSessionFactory().evictEntity(entityName);
	}

	public void evictEntity(String entityName, Serializable id)
			throws HibernateException {
		getSessionFactory().evictEntity(entityName, id);
	}

	public void evictCollection(String roleName) throws HibernateException {
		getSessionFactory().evictCollection(roleName);
	}

	public void evictCollection(String roleName, Serializable id)
			throws HibernateException {
		getSessionFactory().evictCollection(roleName, id);
	}

	public void evictQueries(String cacheRegion) throws HibernateException {
		getSessionFactory().evictQueries(cacheRegion);
	}

	public void evictQueries() throws HibernateException {
		getSessionFactory().evictQueries();
	}

	public Set getDefinedFilterNames() {
		return getSessionFactory().getDefinedFilterNames();
	}

	public FilterDefinition getFilterDefinition(String filterName)
			throws HibernateException {
		return getSessionFactory().getFilterDefinition(filterName);
	}

	public boolean containsFetchProfileDefinition(String name) {
		return getSessionFactory().containsFetchProfileDefinition(name);
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.applicationContext = applicationContext;
	}	

}

 

 

 

分享到:
评论
1 楼 xk0230 2013-08-15  
引用

    [*]

    [*]
 

相关推荐

    spring+hibernate和spring+myBatis实现连接多个数据库,同时操作的项目

    "spring+hibernate和spring+myBatis实现连接多个数据库,同时操作的项目"是针对这种需求的一个解决方案,旨在提供一种灵活且动态的数据源切换机制。 首先,Spring框架作为Java领域中最受欢迎的应用框架之一,其强大...

    spring+hibernate整合简单示例

    虽然Hibernate是JPA的一种实现,但Spring可以透明地处理两者之间的切换,让开发者有更大的选择余地。 6. **Query对象的创建和执行**:Spring的HibernateTemplate提供了方便的queryForList、get、load等方法,简化了...

    springMVC+spring+hibernate+jquery分页完整项目,完整代码

    在这个项目中,SpringMVC和Hibernate结合,实现了后端的分页处理,而jQuery则负责前端的分页展示和交互,用户可以轻松地浏览和切换页面。 6. 项目结构: - `.classpath` 和 `.project` 是Eclipse IDE的配置文件,...

    Spring+Hibernate多数据源

    Spring提供了AbstractRoutingDataSource类,允许我们根据某种规则(如事务、请求上下文等)动态切换数据源。我们需要扩展这个类,并实现determineCurrentLookupKey方法来决定当前应该使用哪个数据源。 接着,描述中...

    一套Spring+Hibernate的多个数据库切换的源码

    通过以上步骤,这套源码应该演示了如何在Spring和Hibernate环境中实现多数据源的动态切换,这对于处理分布式系统中的数据隔离或分库分表等复杂情况非常有帮助。学习并理解这个项目,可以帮助开发者掌握更高级的...

    spring 3.29+struts2.3.15.1+hibernate3 动态切换数据源

    本项目“spring 3.29+struts2.3.15.1+hibernate3 动态切换数据源”正是针对这一需求,通过整合Spring、Struts2和Hibernate3这三大经典Java EE框架,实现了数据源的灵活配置和动态切换。 首先,Spring作为Java应用中...

    Spring+Hibernate构建开发环境

    将Spring与Hibernate集成,可以利用Spring的DI机制管理Hibernate SessionFactory和SessionFactoryBean,从而实现对数据库操作的事务管理。在Spring配置文件中,我们需要定义SessionFactory的bean,并配置数据源。 ...

    spring+hibernate解决多数据源问题3.pdf

    综上所述,解决多数据源问题主要涉及对Spring与Hibernate整合配置的理解、装饰器设计模式的应用,以及动态数据源管理的实现。通过将这些知识点结合起来,开发人员可以灵活地为复杂业务需求下的应用配置和管理多个...

    SSH(Struts1+Spring+Hibernate)配置开发总结

    通过以上步骤,可以顺利完成Struts1+Spring2+Hibernate3.1框架组合的配置工作,并通过简单的注册功能实现来进行环境测试。本教程不仅涵盖了基本的配置流程,还提供了实际操作过程中的注意事项,希望能够帮助开发者...

    smartgwt + spring + hibernate

    总的来说,这个项目展示了如何使用SmartGWT构建富客户端界面,通过Spring实现松耦合的架构,并利用Hibernate处理数据持久化。对于初学者,这是一个很好的学习案例,可以帮助理解如何将这三个强大工具结合在一起,...

    Struts+Spring+Hibernate整合开发

    此外,Spring还支持Hibernate的SessionFactory配置,可以实现多数据源支持和动态数据源切换。 **整合过程** 1. 首先,引入Struts、Spring和Hibernate的相关库,并配置它们的依赖。 2. 创建Spring的配置文件,定义...

    留言管理程序(Struts + Spring + Hibernate完成)

    在SSH整合中,Spring主要负责管理对象(包括Struts的Action和Hibernate的SessionFactory)的生命周期,实现各层之间的解耦。同时,Spring还提供了数据访问抽象,使得可以方便地切换不同的持久化技术,如Hibernate。 ...

    struts+spring+hibernate通用分页方法

    在Java企业级开发中,Struts、Spring和Hibernate是经典的MVC架构组合,常被称为SSH框架。这三种技术的结合可以有效地实现业务逻辑处理、数据持久化和前端展示的分离,提高开发效率和代码可维护性。本篇将详细介绍...

    spring3+hibernate4+maven+junit 多库多数据源实现

    DataSourceTransactionManager用于管理数据库事务,而AbstractRoutingDataSource则允许动态选择数据源,从而实现切换到不同的数据库。 其次,Hibernate 4是一个流行的ORM(对象关系映射)工具,它简化了Java应用与...

    java框架所用的Stru2t+Spring4+hibernate4的架包

    Spring作为核心,管理整个应用的bean,包括Struts2的Action和Hibernate的SessionFactory。Struts2处理HTTP请求,调用由Spring管理的业务服务,这些服务再通过Hibernate与数据库进行交互。这种架构分工明确,降低了...

    spring4+hibernate4+jpa 附有jar包

    在Spring4中集成Hibernate4和JPA,可以实现强大的数据持久化能力。Spring通过其声明式事务管理,使得事务处理变得简单。同时,Spring的JPA支持提供了Repository接口,使得数据访问如同操作普通的Java对象一样方便。...

    2012年最权威,最完整SSH面试题(Struts+Spring+Hibernate面试题问答23题,选择30题) 问答23题,选择30题(附答案)

    ### SSH (Struts + Spring + Hibernate) 面试题知识点详解 #### 1. Hibernate 工作原理及其重要性 **原理:** 1. **读取并解析配置文件:** Hibernate 使用配置文件来指定数据库连接信息、事务管理策略等设置。 2....

    springMVC + Hibernate 工程模板

    两种配置:oracle mysql,切换数据库只要把SessionFactory的配置文件改成对应就可以了 c3p0配置:mysql调试通过,oracle由于存在问题,未配置 spring配置式事务管理(jdk动态代理,每个service必须对应一个接口) ...

    struts2.1.6+spring2.5+hibernate3.3.1

    整合SSH框架时,Spring会管理Struts2的Action和Hibernate的SessionFactory,实现依赖注入。Struts2的Action可以通过Spring的注解配置,使得组件之间的解耦更加灵活。同时,Hibernate的实体类也可以通过注解进行...

    spring集合hibernate多数据切换

    本知识点主要探讨如何在Spring中集成Hibernate来实现多数据源的动态切换功能,这对于需要处理多种数据源的应用来说至关重要。 首先,我们需要理解什么是多数据源。多数据源意味着一个应用程序可以连接并操作多个...

Global site tag (gtag.js) - Google Analytics