(十七)Hibnernate 和 Spring 整合

Posted 专注改变人生。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(十七)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>


全部代码在:  链接

 



以上是关于(十七)Hibnernate 和 Spring 整合的主要内容,如果未能解决你的问题,请参考以下文章

企业级 Spring Boot 教程 (十七)上传文件

Spring(十七):Spring AOP:通知(前置后置返回异常环绕)

Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程十七

Spring官网阅读(十七)Spring中的数据校验

Spring Boot2 系列教程(二十七)Nginx 极简扫盲入门

Spring(十七):Spring AOP:通知(前置后置返回异常环绕)