最近做项目,第一次整合spring、hibernate、struts,这里收集点资料,做下参考。学j2ee的都知道,在Spring中整合Hibernate也算是需要掌握的基础知识了,整合的过程比整合Struts相对来说要简单许多,我们要实现的目标是整合,思路就是让spring容器来管理SessionFactory,这样就可以使用Spring的声明式事务了。

在 Spring 中配置 SessionFactory,可以利用Spring提供的 LocalSessionFactoryBean 工厂 Bean, 声明一个使用 XML 映射文件的 SessionFactory 实例。需要为该工厂 Bean 指定 configLocation 属性来加载 Hibernate 配置文件。例如:

<bean id=”sessionFactory” class=”org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
<property name=”configLocation” value=”hibernate.cfg.xml”></property>
</bean>

这样就可以在Bean中注入SessionFactory了。但是SessionFactory需要注入一个DataSource才可以,所以还要声明一个DateSource来进行注入,为了将数据库的信息以及数据库连接池的信息配置在配置文件里面,所以使用的<context:property-placeholder location=”classpath:C3P0_config.properties” />,所以如下代码:

<bean id=”dataSource” class=”com.mchange.v2.c3p0.ComboPooledDataSource”>
<property name=”user” value=”${user}” />
<property name=”password” value=”${password}” />
<property name=”jdbcUrl” value=”${jdbcUrl}” />
<property name=”driverClass” value=”${driverClass}” />
<property name=”checkoutTimeout” value=”${checkoutTimeout}” />
<property name=”idleConnectionTestPeriod” value=”${idleConnectionTestPeriod}” />
<property name=”initialPoolSize” value=”${initialPoolSize}” />
<property name=”maxIdleTime” value=”${maxIdleTime}” />
<property name=”maxPoolSize” value=”${maxPoolSize}” />
<property name=”minPoolSize” value=”${minPoolSize}” />
<property name=”maxStatements” value=”${maxStatements}” />
</bean>

其中的这些${}中的变量是在C3P0_config.properties属性文件中定义的,如下所示:
user=root
password=root
jdbcUrl=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver
checkoutTimeout=30000
idleConnectionTestPeriod=30
initialPoolSize=10
maxIdleTime=30
maxPoolSize=100
minPoolSize=10
maxStatements=200
这样就可以把dataSource注入给这个sessionFactory了,这样再进行测试的时候就可以成功了,这里只是将基本的整合做好了,但是要实现声明式事务必须还要进行如下的配置:
配置事务管理器:

<bean id=”transactionManager” class=”org.springframework.orm.hibernate3.HibernateTransactionManager”> <property name=”sessionFactory” ref=”sessionFactory”></property>
</bean>

接下来就是如何来配置声明式事务了。

<tx:advice id=”transactionAdvice” transaction-manager=”transactionManager”>
<tx:attributes><tx:method name=”savePerson”/> </tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression_r=”execution(* cn.itcast.spring.hibernate.*.*(..))” id=”hibernatepointcut”/>
<aop:advisor advice-ref=”transactionAdvice” pointcut-ref=”hibernatepointcut”/>
</aop:config>

配置好了这些就可以进行数据库的查询和修改操作了,因为这时候就开启了事务,事务的开启不是我们做的,是Spring的帮我们做的,这就是Spring的声明式事务的魅力,为了减少配置文件的存在,我们可以将Hibernate的配置文件中的信息拿到Spring的配置文件中来。比如我们可以把映射文件的路径信息拿到这里面来 如下:

<property name=”mappingResources” >
<list> <value>cn/itcast/spring/hibernate/Person.hbm.xml</value>
</list>
</property>

将这个放在SessionFactory的属性中进行注入进来,显然这时候Hibernate的配置文件的分量又减轻了,还有一些基本的信息就是关于Hibernate的基本的属性信息,也可以加进来

<property name=”hibernateProperties”>
<props>
<prop key=”hibernate.dialect”>org.hibernate.dialect.MySQLDialect</prop>
<prop key=”hibernate.show_sql”>true</prop>
<prop key=”hibernate.format_sql”>true</prop>
<prop key=”hibernate.hbm2ddl.auto”>update</prop>
</props>
</property>

这时候就可以完全的舍弃Hiberante的配置文件了,因此我们的Hibernate也就和Spring整合的完成了。基本上就是这些,还有就是关于使用注解的方式来进行整合,当然那种方式整合起来更简单,因此具体的整合思路是一致的,所以我就不再重复了。