zoukankan      html  css  js  c++  java
  • (十七)Hibnernate 和 Spring 整合

    一、Hibnernate 和 Spring结合方案:

      • 方案一:  框架各自使用自己的配置文件,Spring中加载Hibernate的配置文件。
      • 方案二:   统一由Spring的配置来管理。(推荐使用)

    二、结合步骤

      2.1   加载框架的jar包

      2.2   框架的配置文件

        hibernate.cfg.xml

    <session-factory>
        <property name="myeclipse.connection.profile">
            com.jdbc.mysql.Driver
        </property>
        <property name="connection.url">
            jdbc:mysql://127.0.0.1:3306/test
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>
        <property name="connection.driver_class">
            com.p6spy.engine.spy.P6SpyDriver
        </property>
        <property name="dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="current_session_context_class">thread</property>
        <mapping class="bean.StudentBean" />
        <mapping class="bean.ClassBean" />
        <mapping class="bean.BlobBEAN" />
    
    
    </session-factory>

      spring.xml:

    <?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:util="http://www.springframework.org/schema/util"
        xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context     
            http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-3.0.xsd ">
    
    <context:component-scan base-package="service"></context:component-scan> <!-- 自动扫描,把 service包里带有@Component注解的类注册为spring上下问的bean-->
    
        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>  <!-- 在spring中加载hiberntae的配置 -->
        </bean>
    
    </beans>
    • StudentService .java  测试在spring中通过DI方式注入SessionFactory
    package service;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.stereotype.Component;
    import org.springframework.stereotype.Service;
    
    import bean.StudentBean;
    
    @Component("studentService")
    public class StudentService {
    
        @Autowired
        private SessionFactory sessionFactory;
        
        public void save(){
            
            Session session=null;
            Transaction tran=null;
            
            try {
                session=sessionFactory.getCurrentSession();
                tran=session.beginTransaction();
                StudentBean stu=new StudentBean();
                stu.setStuId(3);
                stu.setClassId("3");
                stu.setStuName("admin3");
                session.save(stu);
                
                tran.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tran.rollback();
            }finally{
                //getCurrentSession无须手动关闭
            }
            
        }
        
        /**
         * 测试在spring中通过DI方式注入SessionFactory
       * 本类的save方法的事务是由Hibernate管理的,所以要在hibernate配置文件的设置
       * <property name="current_session_context_class">thread</property> *
    @param args */ public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml"); StudentService stuService=(StudentService)context.getBean("studentService"); stuService.save(); } }
    •  Test_Transaction.java测试在spring管理事务。(Hibernate不再参与事务的提交与回滚)
    package test;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.stereotype.Controller;
    
    import service.TransactionService;
    
    /**
     * 测试在spring管理事务。(Hibernate不再参与事务的提交与回滚)
     * @author 半颗柠檬、
     *
     */
    
    @Controller(value="tranTest")
    public class Test_Transaction {
    
        @Autowired
        private TransactionService tranService;
        
            public static void main(String[] args) throws Exception {
                ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
                
                Test_Transaction stuTest=(Test_Transaction)context.getBean("tranTest");
                stuTest.tranService.save_a();
                
            }
    }
    • TransactionService .java
    package service;
    
    import javax.transaction.Transactional;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import dao.StudentDao;
    
    @Service
    @Transactional
    public class TransactionService {
        @Autowired
        private StudentDao stuDao;
        
        public void save_a() throws Exception{
            stuDao.save_1();
            stuDao.save_2();
            
        }
        
    }
    • StudentDao .java
    package dao;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Repository;
    
    import bean.StudentBean;
    
    @Repository(value = "stuDao")
    public class StudentDao {
    
        @Autowired
        private SessionFactory sessionFactory;
    
        public void save_1() throws Exception {
            Session session = null;
    
            try {
                session = sessionFactory.getCurrentSession();
                StudentBean stu = new StudentBean();
                stu.setStuId(15);
                stu.setClassId("3");
                stu.setStuName("admin3");
                session.save(stu);
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
    
        }
    
        public void save_2() throws Exception {
            Session session = null;
            try {
    
                session = sessionFactory.getCurrentSession();
                StudentBean stu = new StudentBean();
                stu.setStuId(1);
                stu.setClassId("3");
                stu.setStuName("admin3");
                session.save(stu);
    
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
    
        }
    
    }
    • spring.xml修改为如下:
    <?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:util="http://www.springframework.org/schema/util"
        xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context     
            http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-3.0.xsd ">
    
        <context:component-scan base-package="service"></context:component-scan> <!-- 自动扫描,把 service包里带有@Component注解的类注册为spring上下问的bean -->
        <context:component-scan base-package="dao"></context:component-scan>
        <context:component-scan base-package="test"></context:component-scan>
    
        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>  <!-- 在spring中加载hiberntae的配置 -->
        </bean>
    
        <bean id="dataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <constructor-arg index="0" name="url"
                value="jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&amp;characterEncoding=UTF-8"></constructor-arg>
            <constructor-arg index="1" name="username" value="root"></constructor-arg>
            <constructor-arg index="2" name="password" value=""></constructor-arg>
            <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        </bean>
    
        <!-- 第一种方式:使用xml配置来配置声明式事务 -->
        <bean name="transactionManager"
            class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
    
        <tx:advice id="advice_1" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="save*" propagation="REQUIRED" />
                <tx:method name="*" propagation="SUPPORTS" />
            </tx:attributes>
        </tx:advice>
    
        <aop:config>
            <!-- Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. -->
            <aop:pointcut expression="execution(* service.*.*(..))"
                id="point_1" />
            <aop:advisor advice-ref="advice_1" pointcut-ref="point_1" />
        </aop:config>
    
        <!-- 第一种方式结束 -->
    
        <!-- 第二种方式:使用事务注解来配置声明式事务 -->
    
        <bean name="transactionManager"
            class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
        <tx:annotation-driven transaction-manager="transactionManager" />
    
        <!-- 第二种方式结束 -->
    
    </beans>
    • hibernate.cfg.xml修改如下:
    <?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">
    <!-- Generated by MyEclipse Hibernate Tools.                   -->
    <hibernate-configuration>
    
    <session-factory>
        <property name="myeclipse.connection.profile">
            com.jdbc.mysql.Driver
        </property>
        <property name="connection.url">
            jdbc:mysql://127.0.0.1:3306/test
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>
        <property name="connection.driver_class">
            com.p6spy.engine.spy.P6SpyDriver
        </property>
        <property name="dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</property>
        <mapping class="bean.StudentBean" />
        <mapping class="bean.ClassBean" />
        <mapping class="bean.BlobBEAN" />
    
    
    </session-factory>
    
    </hibernate-configuration>
    • 注意:  如果把hibernate的事务交给spring管理,那么配置必须修改为<property name="current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</property>  ,如果事务还是在hibernate里管理,则<property name="current_session_context_class">thread</property>


    全部代码在:  链接

  • 相关阅读:
    Door Frames CodeForces
    POJ 3090 Visible Lattice Points (ZOJ 2777)
    从斐波那契到矩阵快速幂
    Recursive sequence (矩阵快速幂)2016ACM/ICPC亚洲区沈阳站
    c++ 类实现 AVL树容器(包含迭代器)
    c++ 链表类的实现(包含迭代器)
    HDU
    【几何+模拟】二次元变换 计蒜客
    【bfs+链式向前星】防御僵尸(defend)计蒜客
    deque in Python
  • 原文地址:https://www.cnblogs.com/shyroke/p/6926130.html
Copyright © 2011-2022 走看看