1.拷贝我们的spring事务控制所需的jar包

2.在spring容器中配置我们的hibernateTemplate以及事务管理器 

  <?xml version="1.0" encoding="UTF-8"?>
  <!-- spring的配置文件:导入约束 -->
  <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.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx.xsd
    ">
    <!-- 自定义的java对象交给spring进行管理 -->
    <bean id="customerService" class="com.itheima.service.impl.CustomerServiceImpl">
      <property name="customerDao" ref="customerDao"></property>
    </bean>
    <bean id="customerDao" class="com.itheima.dao.impl.CustomerDaoImpl">
      <property name="hibernateTemplate" ref="hibernateTemplate"></property>
    </bean>
    <!-- 第三方的jar包中的java对象交给spring进行管理 -->
    <!-- 创建一个hibernateTemplate对象 -->
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
      <!-- 注入sessionFactory -->
      <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!-- 创建sessionFactory对象 -->
    <!-- 当spring和hibernate整合时,这个sessionFactory的实现类是由spring提供的:LocalSessionFactoryBean,
    创建sessionFactory是根据hibernate的核心配置文件
    -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
      <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
    </bean>
    <!--配置hibernate的事务管理 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
      <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!-- 配置事务管理通知 -->
    <tx:advice id="txAdvice">
      <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" read-only="false"/>
        <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
      </tx:attributes>
    </tx:advice>
    <!-- 配置事务的AOP -->
    <aop:config>
      <aop:pointcut expression="execution(* com.itheima.service.impl.*.* (..))" id="pt"/>
      <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
    </aop:config>
</beans>

3.对我们的到层进行改造

  public interface CustomerDao {
    void save(Customer customer);

    List<Customer> find();
  }

  public class CustomerDaoImpl implements CustomerDao {
    /**
    * 通过sessionFactory创建session对象进行数据库的CRUD操作
    * 创建HiberanteTemplete的对象过程中,需要依赖注入一个sessionFactory
    */
    private HibernateTemplate hibernateTemplate;

    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
      this.hibernateTemplate = hibernateTemplate;
    }
    public void save(Customer customer) {
      hibernateTemplate.save(customer);
    }

    public List<Customer> find() {
      //hql查询所有的客户
      //1.获取query对象,session.createQuery(hql) 2.传递查询参数 3.得到查询 结果
      //find方法第一个参数,hql语句,第二个参数,变长参数列表
      return (List<Customer>) hibernateTemplate.find("from Customer");
    }

  }

4.测试我们的hibernate和spring整合

  @RunWith(SpringJUnit4ClassRunner.class)
  @ContextConfiguration(locations={"classpath:applicationContext.xml"})
  public class SpringAndHibernateTest {
    @Autowired
    private CustomerService customerService;

    @Test
    public void getAllCustomerTest(){
      List<Customer> customers = customerService.getAllCustomer();
      for (Customer customer : customers) {
        System.out.println(customer);
      }
    }
    @Test
    public void addCustomerTest(){
      Customer customer = new Customer();
      customer.setCustName("赵子龙");
      customerService.addCustomer(customer);
    }
  }

这里我们测试我们的fgetAllCustomerTest方法会报错,具体原因呢,我也说不清楚,但可以看看这个链接https://blog.csdn.net/yinjian520/article/details/866669,

  org.springframework.orm.hibernate5.HibernateSystemException: createQuery is not valid without active transaction; nested exception is org.hibernate.HibernateException:   createQuery is not valid without active transaction
  at org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:219)
  at org.springframework.orm.hibernate5.HibernateTemplate.doExecute(HibernateTemplate.java:344)
  at org.springframework.orm.hibernate5.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:309)
  at org.springframework.orm.hibernate5.HibernateTemplate.find(HibernateTemplate.java:863)
  at com.itheima.dao.impl.CustomerDaoImpl.find(CustomerDaoImpl.java:25)
  at com.itheima.service.impl.CustomerServiceImpl.getAllCustomer(CustomerServiceImpl.java:18)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:606)
  at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302)
  at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
  at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
  at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
  at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
  at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
  at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
  at com.sun.proxy.$Proxy33.getAllCustomer(Unknown Source)
  at com.itheima.test.SpringAndHibernateTest.getAllCustomerTest(SpringAndHibernateTest.java:23)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:606)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
  at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
  at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
  at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
  at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:254)
  at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
  at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
  at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
  at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193)
  at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
  at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
  Caused by: org.hibernate.HibernateException: createQuery is not valid without active transaction
  at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:334)
  at com.sun.proxy.$Proxy34.createQuery(Unknown Source)
  at org.springframework.orm.hibernate5.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:866)
  at org.springframework.orm.hibernate5.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:863)
  at org.springframework.orm.hibernate5.HibernateTemplate.doExecute(HibernateTemplate.java:341)
  ... 49 more

解决的方法就是在hibernate的核心配置文件中注释

  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  <hibernate-configuration>
    <session-factory>
      <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
      <property name="hibernate.connection.url">jdbc:mysql:///ssh_280</property>
      <property name="hibernate.connection.username">root</property>
      <property name="hibernate.connection.password">root</property>
      <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
      <!-- 配置C3P0连接池 -->
      <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
      <property name="hibernate.hbm2ddl.auto">update</property>

      <!-- 显示sql语句 show_sql true|false(默认值) -->
      <property name="hibernate.show_sql">true</property>

      <!-- 格式化sql format_sql true|false(默认值) -->
      <property name="hibernate.format_sql">true</property>

      <!-- 获取与当前线程绑定的session
      当spring和hibernate整合的时候,获取的session对象本身就是与当前线程绑定的对象
      所以hibernate.current_session_context_class的配置可以省略
      * session对象是由spring提供的session,这个session并不认识thread的配置
      * 需要配置SpringSessionContext
      <property name="hibernate.current_session_context_class">SpringSessionContext</property>
      -->
      <!-- 映射文件的位置
        class:指定配置了jpa注解的实体类的全限定类名
        resource:xml格式的映射文件
      -->
      <mapping resource="com/itheima/entity/Customer.hbm.xml" />
    </session-factory>
  </hibernate-configuration>

  看一下我们测试以后的结果吧

  每天进步一点点!

 

ssh整合之三hibernate和spring整合的更多相关文章

  1. struts2,hibernate,spring整合笔记(2)

    上一话struts2,hibernate,spring整合笔记(1) 接下来继续 配置完struts之后就要开始hibernate的配置 hibernate的环境并不依赖web开发环境,在我第一次配置 ...

  2. struts2,hibernate,spring整合笔记(3)

    struts2,hibernate,spring整合笔记(1) struts2,hibernate,spring整合笔记(2) 配好struts和hibernate就要开始spring了 老规矩,还是 ...

  3. Hibernate 与Spring整合出现 hibernate.HibernateException: createCriteria is not valid without active transaction

    当 Hibernate 和 Spring 整合时,在 Spring 中指定的 Hibernate.cfg.xml 文件内容中要注释掉以下内容: <!-- Enable Hibernate's a ...

  4. 【SSH框架】系列之 Spring 整合 Hibernate 框架

    1.SSH 三大框架整合原理 Spring 与 Struts2 的整合就是将 Action 对象交给 Spring 容器来负责创建. Spring 与 Hibernate 的整合就是将 Session ...

  5. 从0开始整合SSM框架--2.spring整合mybatis

    依赖:<properties> <!-- spring版本号 --> <spring.version>4.1.3.RELEASE</spring.versio ...

  6. SSH开发实践part4:Spring整合Struts

    1 好了,前面spring与hibernate的整合开发我们基本上讲完了,现在要开始服务层的开发,也就是处理事务的action,在这里我们需要引入spring与struts的整合.也就是将action ...

  7. ssh整合之五struts和spring整合

    1.首先,我们需要先分析一下,我们的spring容器在web环境中,只需要一份就可以了 另外,就是我们的spring容器,要在我们tomcat启动的时候就创建好了(包括其中的spring的对象),怎么 ...

  8. 框架整合----------Hibernate、spring整合

    说到整合框架,其实也就是环境的搭建了,首先我们要导包,这里连接数据库我们用到了spring容器,我们用连接池来进行数据库的连接,我们需要导入c3p0和jdbc的jar包,其余的就是spring和Hib ...

  9. struts2,hibernate,spring整合笔记(4)--struts与spring的整合

    饭要一口一口吃,程序也要一步一步写, 很多看起来很复杂的东西最初都是很简单的 下面要整合struts和spring spring就是我们的管家,原来我们费事费神的问题统统扔给她就好了 先写一个测试方法 ...

随机推荐

  1. WordPress怎么给分类目录排序

    WordPress默认的分类目录是按照字母的顺序排序的, 我们可以安装一款插件Category Order就可以自定义分类目录的顺序了,这款插件很小,安装后即可在后台的左侧菜单中看见Category ...

  2. 使用Angular CLI进行Build (构建) 和 Serve

    第一篇文章是: "使用angular cli生成angular5项目" : http://www.cnblogs.com/cgzl/p/8594571.html 第二篇文章是: & ...

  3. Python快速入门之与C语言异同

    代码较长,建议使用电脑阅读本文. 10分钟入门Python 本文中使用的是Python3如果你曾经学过C语言,阅读此文,相信你能迅速发现这两种语言的异同,达到快速入门的目的.下面将开始介绍它们的异同. ...

  4. kubernetes实现用户自定义扩缩容

    本文章主要参考walkthrough,aggregation和auth.涉及custom metric API的注册认证以及API server aggregation的相关知识.walkthroug ...

  5. 20165226 预备作业3 Linux安装及学习

    20165226 预备作业3 Linux安装及学习 Linux安装 一.下载安装VirtualBox 1.首先在官网下载,点开基于VirtualBox虚拟机安装Ubuntu图文教程 找到版本进行下载安 ...

  6. V5.7_UTF8_SP1、SP2---任意前台用户登录(cookie伪造)

    漏洞触发点在include/memberlogin.class.php中的MemberLogin类中的登录校验函数 可以看到M_ID参数是由GetNum(GetCookie("DedeUse ...

  7. Mycat 注解说明

    我们知道MySQL 数据库有自己的SQL注解(hint),比如 use index.force index.ignore index 等都是会经常用到的,Mycat 作为一个数据库中间件,最重要的是 ...

  8. ASUS T100TA 换屏要记

    建议完整阅读后再执行操作! 参考: [图片]华硕T100换触摸屏详细教程,全网第一发[平板电脑吧]_百度贴吧 [图片]我是这么修T100的……换外屏[win8平板吧]_百度贴吧 淘宝信息: 选择适用型 ...

  9. oracle10g 基于linux6安装问题收集

    1.[oracle@rsyslogserver database]$ dbca -silent -responseFile /home/oracle/database/dbca.rsp No comm ...

  10. 设计模式 --> (15)职责链模式

    职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 示例 考虑员工要求加薪.公司的管理者一共有 ...