`
tangyanbo
  • 浏览: 263175 次
  • 性别: 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+quartz 定时操作数据库

    在spring+hibernate的框架中定时操作数据库,主要是拿到sessionFactory,不会出现no session 和transaction no-bound等问题,由sessionFactory完成对数据的操作,有些包是没有用的,有兴趣的可以自己删除掉

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    Spring4.0+Hibernate4.0+Struts2.3整合案例

    Spring4.0+Hibernate4.0+Struts2.3整合案例:实现增删改查。 ===================== application.xml: xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...

    Spring+Jotm+Hibernate+Oracle+Junit 实现JTA分布式事务要求Demo工程

    2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的...

    Struts2+Hibernate+Spring整合实例

    Struts2+Hibernate+Spring整合实例,登陆注册实例,简单来说,Spring通过IoC容器上管(Struts2)Action的创建并依赖注入给控制器,下管(hibernate)SessionFactory的创建并依赖注入给DAO组件,是一个巨大的工厂

    spring配置sessionFactory(spring3.2.3+hibernate4.2.2)

    一个实例小工程,讲解的是将hibernate的sessionFactory交给spring管理的配置方法

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    Spring + Hibernate + Struts 事务配置小例子(带提示框等小技巧)

    前几天搞 Spring + Hibernate + Struts 事务配置 ,网上找了好多资料,不过好无语,大多都是 Ctrl + V,浪费俺的宝贵时间 现在我总结配出一套,给大家参考参考,可能有不足,请大家多多交流。 附:内有弹出...

    基于J2EE短信共享网站设计(Spring+Struts2+Hibernate)

    基于三大框架架构Spring+Struts2+Hibernate 这个是我毕业设计,有论文,也有答辩ppt,开题报告... 比较成功,所以传上来与大家分享。 界面采用新浪界面样式, 后台层次非常清晰。 数据库采用MySql。 服务器用tomcat...

    ssh框架整合step by step (springMVC + spring 5.0.4 + hibernate 5.0.12)

    # 不熟悉git的同学也没关系, 根据不同搭建进度, 资源内分别打了三个项目(springmvc、springmvc+spring、springmvc+spring+hibernate), 可逐个对比查看; # 项目主要描述ssh的搭建步骤, 前端仅仅是几个简单的展示页面;...

    Struts+Spring+Hibernate补充内容

    在SSH中实现以下功能时, 需要将Tomcat中站点目录下/WEB-INF/lib 中的asm-2.2.3.jar和commons-collections-2.1.1.jar 文件删除,否则会引起类冲突 分离配置文件: 在src目录下创建多个xml文件,分别配制项目中的 ...

    利用Spring来管理Hibernate完整例子

    其中Hibernate每次都需要手动创建SessionFactory,Session,手动开启提交关闭事务。而这一切操作完全是由Spring来代替。使持久层更加方便,使开发人员减少持久层操作,把注意力放到业务上。

    spring2.5+struts2+hibernate3.3整合

    这是一个spring2.5+struts2+hibernate3.3的整合完整项目,struts2的ActionBean,hibernate的sessionFactory交与了spring容器创建与管理

    spring2.5+hibernate3.3+struts1.3的整合

    一个spring2.5+hibernate3.3+struts1.3的整合的完整项目,该项目使用spring容器创建sessionFactory,管理struts ActionBean的创建,其中使用注解的方式创建实体Bean以及依赖注入和事务

    springMVC + Hibernate 工程模板

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

    NewsSystem:基于Struts + Spring + Hibernate + Bootstrap

    准备WEB-INF路径下applicationContex.xml文件作为Spring配置文件,在Spring中定义数据源Bean,使用C3P0数据源,定义Hibernate的SessionFactory,并依赖注入数据源。 magicgis.newssystem.models实体类及Hibernate...

    Struts,Spring,Hibernate三大框架的面试&笔试题

    1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭...

    Myeclipse开发struts+hibernate+spring新手入门--环境配置---项目开发示例

    Myeclipse开发struts+hibernate+spring新手入门---环境配置----项目开发示例 Myeclipse开发struts+hibernate+spring小记 开发前准备工作: 1、下载eclipse3.1版本 下载地址: 2、下载Myeclipse插件 下载地址: 3...

    springMVC+hibernate+sqlServer2005

    通过现在非常流行的注解方式,使用SpringMVC注解管理hibernate的sessionfactory和transaction。抽象并简化dao层的代码,只有一个抽象类和一个实现类,便于管理。不需要hibernate配置cfg.xml文件,采用@Entity、@...

Global site tag (gtag.js) - Google Analytics