zoukankan      html  css  js  c++  java
  • ssh整合之三hibernate和spring整合

    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>

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

      每天进步一点点!

     

  • 相关阅读:
    vue打包配置发布路径
    qt编程参考资料
    qt下载地址
    树结构遍历节点名字提取,这里提取的是el-tree数据结构,封装成函数
    set实现数组去重后是对象,这里转化为数组
    js中的async await
    微信小程序调微信支付
    Http权威指南(TCP连接)
    Http权威指南(报文)
    Http权威指南(概述篇总结)
  • 原文地址:https://www.cnblogs.com/wh-share/p/ssh_spring_hibernate.html
Copyright © 2011-2022 走看看