Spring整合Hibernate

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cuiyaoqiang/article/details/51890309

DAO模式是一种标准的Java
EE设计模式,DAO模式的核心思想是,所有的数据库访问都通过DAO组件完成,DAO组件封装了数据库的增、删、改等原子操作。业务逻辑组件依赖于DAO组价提供的数据库原子操作,完成系统业务逻辑的实现。

针对Hibernate持久层访问技术而言,Spring提供了如下三个工具类来支持DAO组件的实现:

  • HibernateDaoSupport
  • HibernateTemplate
  • HibernateCallback

管理Hibernate的SessionFactory

当通过Hibernate进行持久层访问时,必须先获得SessionFactory对象,他是单个数据库映射关系编译后的内存镜像。大部分情况下,一个JavaEE应用对应一个数据库,即对应一个SessionFactory对象。

<?xml version="1.0" encoding="GBK"?>
<!-- Spring配置文件的根元素,使用spring-beans-3.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <!-- 定义数据源Bean,使用C3P0数据源实现 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <!-- 指定连接数据库的驱动 -->
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <!-- 指定连接数据库的URL -->
        <property name="jdbcUrl" value="jdbc:mysql://localhost/hibernate"/>
        <!-- 指定连接数据库的用户名 -->
        <property name="user" value="root"/>
        <!-- 指定连接数据库的密码 -->
        <property name="password" value="32147"/>
        <!-- 指定连接数据库连接池的最大连接数 -->
        <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>
                <!-- 以下用来列出Hibernate映射文件 -->
                <value>org/crazyit/app/domain/Person.hbm.xml</value>
            </list>
        </property>
        <!-- 定义Hibernate的SessionFactory的属性 -->
        <property name="hibernateProperties">
            <!-- 配置Hibernate属性 -->
            <value>
            hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
            hibernate.hbm2ddl.auto=update
            hibernate.show_sql=true
            hibernate.format_sql=true;
            </value>
        </property>
    </bean>
    <!-- 定义DAO Bean-->
    <bean id="personDao"
        class="com.bh.dao.impl.PersonDaoImpl">
        <!-- 注入持久化操作所需的SessionFactory -->
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
</beans>

使用HibernateTemplate

HibernateTemplate提供持久层访问模板化,他只需要提供一个SessionFactory的引用就可执行持久化的操作。SessionFactory对象即可通过构造参数传入,也可通过设值方式传入。

HibernateTemplate提供了如下三个构造函数。

  • ① HibernateTemplate();构造一个默认的HibernateTemplate实例,因此创建了HibernateTemplate实例后,还必须使用方法setSessionFactory(SessionFactory
    sf)为HibernateTemplate注入SessionFactory对象,然后才可以进行持久化操作。
  • ② HibernateTemplate(org.hibernate.SessionFactory
    sessionFactory):在构造时已经传入SessionFactory对象,创建后即可进行持久化操作。
  • ③ HibernateTemplate(org.hibernate.SessionFactory
    sessionFactory,boolean
    allowCreate);allowCreate参数表明如果当前线程没有找到一个事务性的session,是否需要创建一个非事务性的session。
<?xml version="1.0" encoding="GBK"?>
<!-- Spring配置文件的根元素,使用spring-beans-4.2.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
    <!-- 定义数据源Bean,使用C3P0数据源实现 -->

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <!-- 指定连接数据库的驱动 -->
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <!-- 指定连接数据库的URL -->
        <property name="jdbcUrl" value="jdbc:mysql://localhost/hibernate" />
        <!-- 指定连接数据库的用户名 -->
        <property name="user" value="root" />
        <!-- 指定连接数据库的密码 -->
        <property name="password" value="root" />
        <!-- 指定连接数据库连接池的最大连接数 -->
        <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.hibernate4.LocalSessionFactoryBean">
        <!-- 依赖注入数据源,注入正是上面定义的dataSource -->
        <property name="dataSource" ref="dataSource" />
        <!-- mappingResouces属性用来列出全部映射文件 -->
        <property name="mappingResources">
            <list>
                <!-- 以下用来列出Hibernate映射文件 -->
                <value>com/bh/domain/Person.hbm.xml</value>
            </list>
        </property>
        <!-- 定义Hibernate的SessionFactory的属性 -->
        <property name="hibernateProperties">
            <!-- 配置Hibernate属性 -->
            <value>
                hibernate.dialect=org.hibernate.dialect.MySQLDialect
                hibernate.hbm2ddl.auto=create
                hibernate.show_sql=true
                hibernate.format_sql=true;
            </value>
        </property>
    </bean>
    <!-- 定义DAO Bean -->
    <bean id="personDao" class="com.bh.dao.impl.PersonDaoImpl">
        <!-- 注入持久化操作所需的SessionFactory -->
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <!-- 配置事务增强处理,指定事务管理器 -->
    <!-- 该类实现PlatformTransactionManager接口,是针对采用数据源连接的特定实现-->
    <bean id="transactionManager" 
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 配置DataSourceTransactionManager时需要依注入DataSource的引用 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!-- 用于配置详细的事务语义 -->
        <tx:attributes>
            <tx:method name="save*" rollback-for="Exception"
                propagation="REQUIRED" />
            <!-- 其他方法使用默认的事务设置 -->
            <tx:method name="*" />
        </tx:attributes>
    </tx:advice>
    <!-- AOP配置的元素 -->
    <aop:config>
        <!-- 配置一个切入点,匹配org.crazyit.app.dao.impl包下 所有以Impl结尾的类里、所有方法的执行 -->
        <aop:pointcut id="myPointcut"
            expression="execution(* com.bh.dao.impl.*.*(..))" />
        <!-- 指定在txAdvice切入点应用txAdvice事务增强处理 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
    </aop:config>
</beans>

使用HibernateCallback

虽然使用hibernatet访问数据库十分方便,但是他也有一定的缺点:灵活性不足,如果我们需要使用Hibernate
API进行持久化访问,借助Hibernate上面的方法就不行了。

HibernateTemplate的灵活访问方式是通过如下两个方法完成的:

  • Object execute(HibernateCallback action);
  • List executeFind(HibernateCallback action);

HibernateCallback 是个接口,该接口包含一个方法

doInHibernate(org.hibernate.Session session)。

public List findByPage(final String hql , final Object value ,
        final int offset, final int pageSize)
    {
        //通过一个HibernateCallback对象来执行查询
        List list = getHibernateTemplate()
            .executeFind(new HibernateCallback()
        {
            //实现HibernateCallback接口必须实现的方法
            public Object doInHibernate(Session session)
                throws HibernateException, SQLException
            {
                //执行Hibernate分页查询
                List result = session.createQuery(hql)
                    //为hql语句传入参数
                    .setParameter(0, value) 
                    .setFirstResult(offset)
                    .setMaxResults(pageSize)
                    .list();
                return result;
            }
        });
        return list;
    }

spring4与Hibernate4整合实例见:http://download.csdn.net/detail/cuiyaoqiang/9574090

展开阅读全文

没有更多推荐了,返回首页