在进行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.配置事务入口