Spring和Hibernate的整合

     Spring和Hibernate的整合关键就是要将Hibernate的sessionFactory交给Spring来管理。另外一个就是配置数据源。下面来讲如何配置数据源:     数据源可以采用一些开源的数据源,如DBCP,c3p0等。也可以采用JNDI数据源,即容器提供的数据源。下面就讲解DBCP的配置:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
		<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property>
		<property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=Libo"></property>
		<property name="username" value="sa"></property>
		<property name="password" value=""></property>
		<property name="maxActive" value="100"></property>
		<property name="maxIdle" value="30"></property>
		<property name="maxWait" value="1000"></property>
</bean>

   配置上面的数据源需要引入DBCP的jar包commons-dbcp.jar。它里边有一个类BasicDataSource,它提供了主要数据源配置属性所应有的getter和setter方法,所以我们才能像上面那样配置。当然,可以配置的属性远远超过我上面配的,如果需要配置其他的属性,可以直接到BasicDataSource类里面找到。

     配置JNDI数据源就相对较简单一些。JNDI数据源一般在容器中已经配置好了,在spring中只不过是引用罢了。

那么如何在容器中配置JNDI数据源呢?下面就以tomcat6为例讲解,tomcat5的方法稍有不同。

     首先,在tomcat的目录下找到一个conf目录,里面有一个文件context.xml,用于配置tomcat启动上下文。现在在里面加上一段话:

<Resource
        name="jdbc/test"   auth="Container"
         type="javax.sql.DataSource"
         driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
         url="jdbc:sqlserver://localhost:1433;databaseName=charge"
         username="sa" password=""
         maxActive="30" maxIdle="10"   maxWait="-1"/>

 将这段话放到</context>标签之前就行。当然,里边的参数可以根据具体的情况设定。配置好了之后我们还需要在web.xml文件中加上一段

<resource-ref>   
        <res-ref-name>jdbc/test</res-ref-name>   
        <res-type>javax.sql.DataSource</res-type>   
        <res-auth>Container</res-auth>   
</resource-ref>

 这里的res-ref-name的值就是context.xml文件中配置的那个名字。这样就配置好了一个JNDI数据源,在程序中我们可以轻松的获得到这个数据源:

Context context = new InitialContext();
DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/test");

 这其中参数java:comp/env/jdbc/test 中java:comp/env/是固定的写法,后面才是JNDI的名字。一旦配置了这样的数据源将使我们获取connection变得异常的简单。

     然而在spring中如何去引用这个数据源呢?首先spring去获得这个数据源的目的是为了将dataSource注入给类org.springframework.orm.hibernate3.LocalSessionFactoryBean,该类会负责创建sessionFactory,即Hibernate的session工厂。所以让spring管理数据源的真正目的是为了管理sessionFactory。spring引用JNDI数据源的方法为:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"
	 lazy-init="false">
	<property name="jndiName" value="java:comp/env/jdbc/test"></property>
</bean>

 这看起来比配置DBCP的数据源要简单多了,其实最终它的底层也是DBCP实现的,它是apache的一个开源项目。

     OK!数据源已经有了,下一步就是如何产生Hibernate所需的sessionfactory了。下面贴出一个简单的代码:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
	 depends-on="dataSource" lazy-init="false">
    <property name="dataSource" ref="dataSource"></property>
    <property name="mappingResources">
       <list><value>en/bean/user.hbm.xml</value></list>
    </property>
    <property name="hibernateProperties">
	<props>
	<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
	<prop key="hibernate.hbm2ddl.auto">update</prop>
	<prop key="hibernate.format_sql">true</prop>
	</props>
    </property>
</bean>

 我们注意到,这里边注入了一个dataSource,这个datasource就是我们刚才创建的那个。另外一个就是引入hibernate的实体类映射文件,所有的映射文件都包含在mappingResources下面。然后就是配置hibernate的相关属性,以properties文件的键值对样式配置,包含在<props></props>之间。这样我们就完全可以省略hibernate自身的配置文件hibernate.cfg.xml了。

     这样就真的OK了,我们只需要在需要用到sessionfactory的地方给他注入就行了。由于用Hibernate访问数据库经常会用到一个类HibernateTemplate。当我们实例化改类的时候,需要给他传入一个sessionfactory的实例。这时我们就可以利用spring给我们去注入这个值。

附录:Spring整合Hibernate必须jar包:

Spring和Hibernate的整合

不要认为asm.jar、commons-collections.jar、dom4j.jar、jta.jar这几个包不重要,没有他Spring启动不了。

相关推荐