Spring和Hibernate的整合和四种事务管理方式

在进行Spring和Hibernate整合之前先将需要的jar导入项目中:

Spring需要的jar包:

1、spring-core

2、spring-context

3、spring-jdbc

4、spring-beans

5、spring-web

6、spring-expression

7、spring-orm (spring和hibenate的整合包)

在pom.xml中编写spring3需要的包(3.1.2.RELEASE):

          
			org.springframework
			spring-core
			${spring.version}
		
		
			org.springframework
			spring-aop
			${spring.version}
		
		
			org.springframework
			spring-context
			${spring.version}
		
		
			org.springframework
			spring-jdbc
			${spring.version}
		
		
			org.springframework
			spring-beans
			${spring.version}
		
		
			org.springframework
			spring-web
			${spring.version}
		
		
			org.springframework
			spring-expression
			${spring.version}
		
		
			org.springframework
			spring-orm
			${spring.version}
		

Hibernate需要的jar包:

        
			org.hibernate
			hibernate-core
			${hibernate.version}
		

数据库驱动jar包:


		
			mysql
			mysql-connector-java
			5.1.1
		

添加aspectjweaver包:


		
			org.aspectj
			aspectjweaver
			1.8.5
		

导入cglib包:

	
		
			cglib
			cglib
			2.2.2
		

以上就是spring和hibernate整合需要的jar包,还有数据库连接池的jar包在等下具体说整合方式的时候在给出。

Spring和Hibernate的整合方式有两种:通过配置hibernate.cfg.xml 文件 和 在Spring配置文件中进行数据源配置;

第一种:有hibernate.cfg.xml文件进行数据源配置,在有Spring直接引用

          如果在hibernate.cfg.xml中进行数据源配置的话,必须指出hibernate.connection.provider_class属性:

	
		org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider
	

否则会报错:Cannot unwrap to requested type [javax.sql.DataSource]。然后引入hibernat-c3p0相关的jar包:

c3p0-0.9.2.1.jar,hibernate-c3p0-4.1.7.Final.jar,mchange-commons-java-0.2.3.4.jar

在pom.xml中进行配置如下(由于hibernate已经不再对dbcp提供支持,所以这里使用的是c3p0):

		
		
			org.hibernate
			hibernate-c3p0
			4.1.7.Final
			
			
				
					c3p0
					c3p0
				
			
		
		
			
			com.mchange
			c3p0
			0.9.2.1
		
		
			com.mchange
			mchange-commons-java
			0.2.3.4
		
		

在spring配置文件中如下配置:

	
	
		
	

第二种方式:在Spring中进行数据源配置

        在Spring的连接池使用同dbcp,所以需要在pom.xml中进行配置(也可以使用上面的c3p0):


		
			commons-dbcp
			commons-dbcp
			1.2.2
		

在spring配置文件中数据源配置文件下:

	
	
		
		
			
				org.hibernate.dialect.MySQLDialect
				true
				true
				create
			
		
		
			
				实体对应的xml文件地址
			
		
	

以上即是Spring和Hibernate整合的两种方式。

        通过上面的设置可以使得Spring和Hibernate完成整合,下面开始说Spring管理Hibernate事务的四种管理方式:

        第一种方式,利用tx标签配置事务。

	
	
		
	
	
	
		
			
			
		
	

	
	
		
		
	

下面也给出几种传播特性的解释:

1. PROPAGATION_REQUIRED: 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择;

2. PROPAGATION_SUPPORTS: 支持当前事务,如果当前没有事务,就以非事务方式执行;

3. PROPAGATION_MANDATORY: 支持当前事务,如果当前没有事务,就抛出异常;

4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起;

5. PROPAGATION_NOT_SUPPORTED: 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起;

6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常;

7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。

         第二种方式,使用代理进行配置


	
		
	
	  
	
	
		
		
			
				
				PROPAGATION_SUPPORTS,-Exception
			
		
	
	
	
		
	

在使用代理管理事务时,如果需要使用到getCurrentSession()这个方法,需要设置(这里所说的有点像是第四种管理方式的配置,有可能代理模式不支持使用getCurrentSession()):

     

同时需要在service上添加@Transactional,不然会报错:org.hibernate.HibernateException: No Session found for current thread

       第三种方式,使用拦截器

	
	
		
	
	
	
		
		
			
				
				PROPAGATION_REQUIRED,-Exception
				PROPAGATION_REQUIRED,+MyException
               
			
		
	
	
	
		
			
				transactionInterceptor
			
		
		
			
				deptDao
			
		
	

       第四种方式,使用注解方式

       
		
	
	  

同时需要在service类上面添加@Transactional。

纵观以上四种在Spring中配置Hibernate事务的方法,其核心都是一样的,不同的只是实现的方式而已。所以看到这,这篇博文中你只需要记住4句话,就可以轻松理解在Spring中配置Hibernate事务的核心:

         1.配置SessionFactory

         2.配置事务容器

         3.配置事务规则

         4.配置事务入口

 

你可能感兴趣的:(java,框架)