• Spring学习7-Spring整合Hibernate


    一、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>

  • 相关阅读:
    Eclipse安装SVN插件(转载)
    推荐eclipse插件Properties Editor(转)
    Eclipse快捷键(转载)
    添加路由命令
    oracle 随机数(转载)
    《图解CSS3——第1章 揭开CSS3的面纱》
    css高度自适应
    JS生成随机数
    判断IE浏览器版本
    IE下SCRIPT5009: “JSON”未定义
  • 原文地址:https://www.cnblogs.com/kabi/p/5182059.html
Copyright © 2020-2023  润新知