本书写了一个常用的Spring整合Hibernate的方法,主要修改spring的xml配置文件。
Hibernate的连接、事务管理等都是由建立SessionFactory开始的,SessionFactory在应用程序中通常只需存在一个实例,因而SessionFactory底层的DataSource可使用spring的IOC注入,之后再把SessionFactory注入到相依赖的对象之中。
<beans> <!-- 数据源配置 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/demo"/> <property name="username" value=""/> <property name="password" value=""/> </bean> <!-- SessionFactory of Hibernate --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" destroy-method="close"> <property name="dataSource" ref="dataSource"/> <!-- 映射文件 --> <property name="mappingResources"> <list> <value>User.hbm.xml</value> <value>Product.hbm.xml</value> </list> </property> <!-- <property name="mappingDirectoryLocations"> <list> <value>classpath:/com/test</value> </list> </property> --> <!-- 指定数据库类型 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> </props> </property> </bean> <!-- 使用举例,对DAO类注入sessionFactory --> <bean id="userDAO" class="com.test.UserDAO"> <property name="sessionFactor" ref="sessionFactory"/> </bean> </beans>
整合的好处,可以直接将DataSource注入至LocalSessionFactoryBean中,至于Hibernate所需的相关设置,则可通过LocalSessionFactory相关属性来设置。省略了hibernate.cfg.xml文件。映射文件(指定对象与其关联的表格)的位置与名称指定在mappingResources中。使用mappingDirectoryLocations属性,可以一次性指定某路径下得所有.hbm.xml文件。
补:如果想保留hibernate.cfg.xml,可以将hibernate的配置单独放在该文件中,在applicationContext.xml中引用该文件。如下:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> </bean>
补充:spring运用在web应用中,只需修改web.xml,添加spring的配置文件及监听器即可。
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>