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包:
不要认为asm.jar、commons-collections.jar、dom4j.jar、jta.jar这几个包不重要,没有他Spring启动不了。