美文网首页
Spring学习笔记(六)-Spring2.5与Hibernat

Spring学习笔记(六)-Spring2.5与Hibernat

作者: G__yuan | 来源:发表于2019-07-11 14:18 被阅读0次

    1.首先引入所需的jar

    2.整体的工程目录为:

    3.开始配置bean.xml(说明一点数据源的一些基本信息还是和之前一样保存在了properties文件中)

    <?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns="http://www.springframework.org/schema/beans"

           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

           xmlns:context="http://www.springframework.org/schema/context"

           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-2.5.xsd

               http://www.springframework.org/schema/context

               http://www.springframework.org/schema/context/spring-context-2.5.xsd

               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd

               http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

       <!--基于注解方式声明切面  -->

          <!--  <aop:aspectj-autoproxy/> -->

           <!--配置自动扫描  -->

          <context:component-scan base-package="com.gaoyuan.service"/>

          <!--当连接数据库的信息写在properties文件中时,配置下面的标签,也就是官方说法,配置占位符  -->

          <context:property-placeholder location="classpath:jdbc.properties"/> 

           <!--配置数据源  -->

            <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

        <property name="driverClassName" value="${driverClassName}"/>

        <property name="url" value="${url}"/>

        <property name="username" value="${username}"/>

        <property name="password" value="${password}"/>

         <!-- 连接池启动时的初始值 -->

     <property name="initialSize" value="${initialSize}"/>

     <!-- 连接池的最大值 -->

     <property name="maxActive" value="${maxActive}"/>

     <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->

     <property name="maxIdle" value="${maxIdle}"/>

     <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->

     <property name="minIdle" value="${minIdle}"/>

       </bean>

       <!-- 把hibernate中的sessionFactory交给spring去管理-->

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

         <property name="dataSource" ref="dataSource"/><!--数据源的用的是上面配置的dataSource  -->

     <property name="mappingResources">

        <list>

          <!--这里面存放hibernate中定义实体对应的xml  -->

          <value>com/gaoyuan/bean/Person.hbm.xml</value>

        </list>

     </property>

         <property name="hibernateProperties">

          <!--配置hibernate的方言-->

        <value>

            hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

            hibernate.hbm2ddl.auto=update

            hibernate.show_sql=false

            hibernate.format_sql=false

            <!--配置hibernate的二级缓存-->

            <!--说明是否使用hibernate的二级缓存-->

            hibernate.cache.use_second_level_cache=true

            <!-- 是否开启查询缓存 -->

                    hibernate.cache.use_query_cache=false

                    <!-- 缓存产品的驱动类 -->

                 hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider

          </value>

         </property>

     </bean>

     <!-- 配置spring专门为hibernate提供的事务管理org.springframework.orm.hibernate3.HibernateTransactionManager这个类时针对hibernate的-->

     <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

       <property name="sessionFactory" ref="sessionFactory"/>

     </bean>

     <!--打开注解的支持,然后在程序中就可以用注解的方式配置事务,transaction-manager属性的意思配置事务管理器,将上面配置的txManager事务管理器交给它。  -->

     <tx:annotation-driven transaction-manager="txManager"/>

    </beans>

    4.定义实体类

    实体的配置文件:(Person.hbm.xml)

    5.PersonServiceImpl.java的实现:

    package com.gaoyuan.service.impl;

    import java.util.List;

    import javax.annotation.Resource;

    import org.hibernate.SessionFactory;

    import org.springframework.stereotype.Service;

    import org.springframework.transaction.annotation.Propagation;

    import org.springframework.transaction.annotation.Transactional;

    import com.gaoyuan.bean.Person;

    import com.gaoyuan.service.PersonService;

    @Service("personService")

    @Transactional

    public class PersonServiceImpl implements PersonService {

    @Resource

    private SessionFactory sessionFactory;

    public void save(Person person){

    //getCurrentSession调用此方法取得spring管理的session,不能用hibernate中的openSession方法来取得

    //session,如果是这样取的话,取到的session spring将不会管理它事务。

    //persist()方法和save()方法的作用一样,但是persist()方法是跟JPA规范保持一致的,所以更规范一些。

    sessionFactory.getCurrentSession().persist(person);

    }

    public void update(Person person){

    //merge()方法和update()方法的作用一样,但是同样是和JPA规范保持一致,将游离的对象进行更新操作之后,返回脱管的对象。

    sessionFactory.getCurrentSession().merge(person);

    }

    //读取操作的时候,将事务关闭,不用再打开事务,这样可以提高性能

    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

    public Person getPerson(Integer id){

    return (Person) sessionFactory.getCurrentSession().get(Person.class, id);

    }

    public void delete(Integer id){

    sessionFactory.getCurrentSession().delete(sessionFactory.getCurrentSession()

    .load(Person.class, id));

    }

    //读取操作的时候,将事务关闭,不用再打开事务,这样可以提高性能

    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

    @SuppressWarnings("unchecked")

    public List<Person> getPersons(){

    return sessionFactory.getCurrentSession().createQuery("from Person").list();

    }

    }

    6.与其对应的接口PersonService

    7.测试:

    8.配置hibernate的二级缓存:

    那个实体需要配置缓存时,可以像Person.hbm.xml文件中的配置缓存方法一样,配置二级缓存,当指明那个实体配置二级缓存之后,还需要配置ehcache.xml文件。此文件配置如下:

    <?xml version="1.0" encoding="UTF-8"?>

    <!--

        defaultCache节点为缺省的缓存策略

         maxElementsInMemory 内存中最大允许存在的对象数量

         eternal 设置缓存中的对象是否永远不过期

         overflowToDisk 把溢出的对象存放到硬盘上

         timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉

         timeToLiveSeconds 指定缓存对象总的存活时间

         diskPersistent 当jvm结束是是否持久化对象

         diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间

     -->

    <ehcache>

        <diskStore path="D:\cache"/>

        <defaultCache  maxElementsInMemory="1000" eternal="false" overflowToDisk="true"

            timeToIdleSeconds="120"

            timeToLiveSeconds="180"

            diskPersistent="false"

            diskExpiryThreadIntervalSeconds="60"/>

        <!-- 为缓存域为cn.itcast.bean.Person,(也就是Person.hbm.xml文件中定义的缓存域)定义特殊的缓存策略,

         如果不定义的话,默认使用上面的缓存策略。-->

    <cache name="com.gaoyuan.bean.Person" maxElementsInMemory="100" eternal="false"

        overflowToDisk="true" timeToIdleSeconds="300" timeToLiveSeconds="600" diskPersistent="false"/>

    </ehcache>

    测试二级缓存结果,会在指定的path(上面指定的是D:/cache)下产出如下文件:

    相关文章

      网友评论

          本文标题:Spring学习笔记(六)-Spring2.5与Hibernat

          本文链接:https://www.haomeiwen.com/subject/poorkctx.html