Spring学习7-Spring整合Hibernate

时间:2022-04-12 15:12:28

一、Springl为什么要整合Hibernate
 
二者的整合主要是把hibernate中核心的一些类型交给spring管理,这些类型主要包括sessionFactory、
transactionManager、transactionTemplate,把这些类型配置成bean,然后注入到hibernate的DAO层
中,这样在DAO层中就可以直接使用这些对象而不用考虑如何创建这些对象
最主要的还是对Service层(业务逻辑层)的事务控制。这个为整合hibernate而创建的spring配置文件可以是任意名称(一般命名为applicationContext.xml),可以存放在任意位置(可以在classes目录),只要Spring能够正确加载该文件即可。

#### 
########  
##########################    
##############

 其实hibernate.cfg.xml文件主要配置的都是sessionFactory的信息,为了便于管理,建议不需要全部把Hibernate.cfg.xml的全部信息转移到spring的配置文件中,只需要把连接数据库的信息交给spring装配成数据源(DBCP数据源或者C3P0等)datasourse(因为DataSourceTransactionManager事务管理器需要这个参数),然后再装配sessionFactory的时候,引入hibernate.cfg.xml即可。如:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"

p:dataSource-ref="dataSource"
 
       
p:configLocation="classpath:hibernate.cfg.xml"
/>

#### 
########  
##########################    
#############
二、整合步骤
  
步骤一、装配LocalSessionFactoryBean

       
在Spring提供的org.springframework.orm.hibernate3.LocalSessionFactoryBean中进行整合,这个Bean提供了多种整合的方法:

方法1.可以通过<property
name="hibernateProperties">标签将hibernate的配置信息以property的方式写入.

<property
name="hibernateProperties">
            
<props>
                
<prop
key="hibernate.dialet">org.hibernate.dialect.MySQLDialect</prop>

<prop
key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>

<prop
key="hibernate.connection.url">jdbc:mysql://localhost:3306/book</prop>

<prop
key="hibernate.connection.username">yuan</prop>

<prop
key="hibernate.connection.password">hanyuan9113</prop>

<prop
key="hibernate.show_sql">true</prop>

<prop
key="hibernate.connection.autocommit">true</prop>

</props>
        
</property>

   
方法2.可以通过<property
name="configLocation">标签直接读取hibernate.cfg.xml配置信息

<property
name="configLocation">
            
<value>classpath:hibernate.cfg.xml</value>

  </property>
       
#上面的这种配置可能出现错误,你可以使用下面的配置解决:

<bean id="sessionFactory"
  
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"

  
p:configLocation="classpath:hibernate.cfg.xml"

/>

 方法3.可以通过<property
name="dataSource">标签指定连接池,连接池中有连接数据库的信息

      
<property name="dataSource">
            
<ref bean="myDataSource" />
       
</property>
      
或者也可以这样写:
  <bean
id="sessionFactory"   
   
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"

p:dataSource-ref="dataSource"  
/>

用以上三种方法之一配置Hibernate信息,装配LocalSessionFactoryBean:

<bean id="sessionFactory"
        
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property
name="hibernateProperties">
            
<props>

<!-- 指定数据库方言:MySql
-->
                 
<prop
key="hibernate.dialet">org.hibernate.dialect.MySQLDialect</prop>

<prop
key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>

<prop
key="hibernate.connection.url">jdbc:mysql://localhost:3306/book</prop>

<prop
key="hibernate.connection.username">yuan</prop>

<prop
key="hibernate.connection.password">hanyuan9113</prop>

<prop
key="hibernate.show_sql">true</prop>

<prop
key="hibernate.connection.autocommit">true</prop>

</props>
        
</property>
 
        
<property
name="mappingResources">
            
<list>
                
<value>com/sunflower/entity/Sutdent.hbm.xml</value>

</list>
        
</property>
 </bean>
 其中<property
name="mappingResources">属性是配置映射文件的。如果有很多映射文件要配置,用这种方法就要为每个映射文件书写配置信息,
这样将会非常麻烦。Spring的
org.springframework.orm.hibernate3.LocalSessionFactoryBean提供了一
个<property
name="mappingDirectoryLocations">属性,将所有配置文件放置到一个统一的地方就能一次性进行配置。例如:

<property
name="mappingDirectoryLocations">
            
<list>
                
<value>classpath:com/sunflower/entity</value>

</list>
       
</property>

将一次性配置com.sunflower.entity包下的所有映射文件。

 
步骤二:装配org.springframework.orm.hibernate3.HibernateTemplate

<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">

<property
name="sessionFactory">
            
<ref bean="sessionFactory" />
        
</property>
    
</bean>
HibernateTemplate类是Spring提供给我们进行Hibernate持久层操作的类,它对增删查改方法进行了封装,通过这个类我们很方便就能操作数据库。<property
name="sessionFactory">标签配置LocalSessionFactoryBean

 
步骤三:装配自定义DAO

   <bean
id="studentDao"
class="com.sunflower.daoimp.StudentDaoImp">
        
<property
name="hibernateTemplate">
            
<ref bean="hibernateTemplate"
/>
        
</property>
    
</bean>
为每个Dao的实现类配置一个HibernateTemplate,然后在Spring配置文件中进行装配,这样就可以使用这个HibernateTemplate进行持久层的操作了。

StudentDaoImp.java

public class StudentDaoImp
extends StudentDaoAdapter {
    
@Override
    
public void saveStudent(Student student) {
        
this.hibernateTemplate.save(student);
    
}
 
    
@Override
    
public Student getStudent(Student student) {
        
return this.hibernateTemplate.get(Student.class,
student.getSno());
    
}
 }

进行测试,Test.java:

public class Test {
 
    
@org.junit.Test
    
public void saveStudent() {
        
ApplicationContext context = new
ClassPathXmlApplicationContext(
                
"applicationContext.xml");
        
StudentDao studentDao = (StudentDao)
context.getBean("studentDao");
 
        
Student student = new Student();
 
        
student.setCno(4);
        
student.setName("喜爱啸");
        
student.setScore(70);
 
        
studentDao.saveStudent(student);
 
    
}
 
 //   
@org.junit.Test
    
public void getStudent() {
        
ApplicationContext context = new
ClassPathXmlApplicationContext(
                
"applicationContext.xml");
        
StudentDao studentDao = (StudentDao)
context.getBean("studentDao");
 
        
Student student = new Student();
        
student.setSno(15);
        
Student s = studentDao.getStudent(student);
 
        
System.out.println("name:" + s.getName());
    
}
 
 }
------------------------------------------------------------------

这里有一个比较全的spring整合Hibernate后的spring配置文件,可以作为参考:
<?xml version="1.0"
encoding="UTF-8"?>
<!-- 指定Spring配置文件的Schema信息 -->
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
   
<!-- 定义数据源Bean,使用C3P0数据源实现 -->
   
<bean id="dataSource"

class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
   
   
<!-- 指定连接数据库的驱动 -->
   
   
<property name="driverClass"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>

<!-- 指定连接数据库的URL -->
   
   
<property name="jdbcUrl"
value="jdbc:sqlserver://localhost;DatabaseName=mydb;SelectMethod=cursor"/>

<!-- 指定连接数据库的用户名 -->
   
   
<property name="user"
value="sa"/>
   
   
<!-- 指定连接数据库的密码 -->
   
   
<property name="password"
value="sa"/>
   
   
<!-- 指定连接数据库连接池的最大连接数 -->
   
   
<property name="maxPoolSize"
value="40"/>
   
   
<!-- 指定连接数据库连接池的最小连接数 -->
   
   
<property name="minPoolSize"
value="1"/>
   
   
<!-- 指定连接数据库连接池的初始化连接数 -->
   
   
<property name="initialPoolSize"
value="1"/>
   
   
<!-- 指定连接数据库连接池的连接的最大空闲时间 -->
   
   
<property name="maxIdleTime"
value="20"/>
   
</bean>
   
<!-- 定义Hibernate的SessionFactory
-->
   <bean
id="sessionFactory"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<!-- 依赖注入数据源,注入正是上面定义的dataSource
-->
   
   
<property name="dataSource"
ref="dataSource"/>
   
   
<!-- mappingResouces属性用来列出全部映射文件
-->
     
<property
name="mappingResources">
   
   
   
<list>
   
   
   
   
<value>com/etc/model/Leave.hbm.xml</value>

<value>com/etc/model/Traine.hbm.xml</value>

<value>com/etc/model/Train.hbm.xml</value>

</list>
   
   
</property>

<!-- mappingDirectoryLocations属性列出映射文件位置
-->
     <!--<property
name="mappingDirectoryLocations">
       
   
<list>
           
   
<value>classpath*:/hbm</value>

</list>
       
</property>
      
-->
 
 
   
<!-- 定义Hibernate的SessionFactory的属性
-->
   
   
<property
name="hibernateProperties">
   
   
   
<props>
   
   
   
   
<!-- 指定数据库方言:SQLServer -->
   
   
   
   
<prop
key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>

<!-- 指定数据库方言:Oracle
-->
  
   
   
<!--<prop
key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
           
-->    
   
   
 
     
     
    <!--
是否根据需要每次自动创建数据库 -->
   
   
   
   
<prop
key="hibernate.hbm2ddl.auto">none</prop>

<!-- 显示Hibernate持久化操作所生成的SQL
-->
   
   
   
   
<prop
key="hibernate.show_sql">true</prop>

<!-- 将SQL脚本进行格式化后再输出 -->
   
   
   
   
<prop
key="hibernate.format_sql">true</prop>

<prop
key="hibernate.connection.autocommit">true</prop>

</props>
   
   
</property>
   
</bean>

<!--
配置Hibernate的局部事务管理器,使用HibernateTransactionManager类
该类实现PlatformTransactionManager接口,是针对Hibernate的特定实现-->

 
<bean id="transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<!--
配置HibernateTransactionManager时需要依注入SessionFactory的引用
-->
       
<property
name="sessionFactory">
       
   
<ref bean="sessionFactory" />
   
   
</property>
   
</bean>
   
<bean id="transactionTemplate"

class="org.springframework.transaction.support.TransactionTemplate">

<property
name="transactionManager">
    
   
   
<ref
bean="transactionManager"/>
   
   
</property>
   
</bean>
</beans>