zoukankan      html  css  js  c++  java
  • Java进阶知识26 Spring与Hibernate整合到一起

    1、概述                        

    1.1、Spring与Hibernate整合关键点

        1) Hibernate的SessionFactory对象交给Spring创建。
        2) hibernate事务交给spring的声明式事务管理。

    1.2、所用到的jar包

        

    2、整合实例(三种方法,推荐使用第三种)  

    2.1、第一种方式:Spring 配置文件,直接加载 hibernate.cfg.xml 配置文件的方式

    User 实体类

     1 package com.shore.entity;
     2 
     3 /**
     4  * @author DSHORE/2019-11-12
     5  * 
     6  */
     7 public class User {
     8     private Integer id;
     9     private String name;
    10     private Integer age;
    11 
    12     public Integer getId() {
    13         return id;
    14     }
    15     public void setId(Integer id) {
    16         this.id = id;
    17     }
    18 
    19     public String getName() {
    20         return name;
    21     }
    22     public void setName(String name) {
    23         this.name = name;
    24     }
    25 
    26     public Integer getAge() {
    27         return age;
    28     }
    29     public void setAge(Integer age) {
    30         this.age = age;
    31     }
    32 }

    User.hbm.xml 配置文件

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC
     3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     5         
     6 <hibernate-mapping  package="com.shore.entity">
     7     <class name="User">  
     8         <id name="id"> 
     9             <generator class="native"/>
    10         </id>
    11         <property name="name" type="java.lang.String"/> 
    12         <property name="age" type="java.lang.Integer"/> 
    13     </class>
    14 </hibernate-mapping>

    DAO 层(接口+接口实现类)

     1 //接口类
     2 public interface IUserDao {
     3     public void save(User user);//
     4 }
     5 
     6 //接口实现类
     7 public class UserDao implements IUserDao {
     8     //从IoC容器注入SessionFactory
     9     private SessionFactory sessionFactory;
    10     public void setSessionFactory(SessionFactory sessionFactory) {
    11         this.sessionFactory = sessionFactory;
    12     }
    13     
    14     @Override  //添加
    15     public void save(User user) {
    16         sessionFactory.getCurrentSession().save(user);
    17     }
    18 }

    Service 层

     1 //接口类
     2 public interface IUserService {
     3     public void save(User user);
     4 }
     5 
     6 //接口实现类
     7 public class UserService implements IUserService {
     8 
     9     private IUserDao userDao;
    10     public void setUserDao(IUserDao userDao) {
    11         this.userDao = userDao;
    12     }
    13     
    14     @Override
    15     public void save(User user) {
    16         userDao.save(user);
    17         //int i = 1/0;  //人为添加异常,测试事务回滚
    18     }
    19 }

    Hibernate 核心配置文件(hibernate.cfg.xml)

     1 <?xml version='1.0' encoding='utf-8'?>
     2 <!DOCTYPE hibernate-configuration PUBLIC
     3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     4         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
     5 
     6 <hibernate-configuration>
     7     <session-factory>
     8         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
     9         <property name="connection.url">jdbc:mysql://localhost:3306/school</property>
    10         <property name="connection.username">root</property>
    11         <property name="connection.password">123456</property>
    12 
    13         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    14         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    15         <property name="show_sql">true</property>
    16         <property name="format_sql">true</property>
    17         <property name="hbm2ddl.auto">update</property>
    18 
    19         <mapping resource="com/shore/entity/User.hbm.xml"/>
    20     </session-factory>
    21 </hibernate-configuration>

    Spring 配置文件(beans.xml)

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     4     xmlns:aop="http://www.springframework.org/schema/aop"
     5     xmlns:tx="http://www.springframework.org/schema/tx"
     6     xsi:schemaLocation="
     7        http://www.springframework.org/schema/beans
     8        http://www.springframework.org/schema/beans/spring-beans.xsd
     9        http://www.springframework.org/schema/tx
    10        http://www.springframework.org/schema/tx/spring-tx.xsd
    11        http://www.springframework.org/schema/aop
    12        http://www.springframework.org/schema/aop/spring-aop.xsd">
    13 
    14     <!-- Spring自动去读取Hibernate的配置文件(hibernate.cfg.xml) -->
    15     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    16         <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
    17     </bean>
    18 
    19     <!-- DAO层 -->
    20     <bean id="userDao" class="com.shore.dao.impl.UserDao">
    21         <property name="sessionFactory" ref="sessionFactory"></property>  <!-- 这里和下面的“配置事务管理器”处对接 -->
    22     </bean>
    23     
    24     <!-- service层 -->
    25     <bean id="userService" class="com.shore.service.impl.UserService">
    26         <property name="userDao" ref="userDao"></property>
    27     </bean>
    28     
    29     <!-- ############Spring声明式事务管理配置########### -->
    30     <!-- 配置事务管理器 -->
    31     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    32         <property name="sessionFactory" ref="sessionFactory"></property>
    33     </bean>
    34     
    35     <!-- 配置事务增强(针对DAO层) -->
    36     <tx:advice transaction-manager="transactionManager" id="transactionAdvice">
    37         <tx:attributes>  <!-- *代表DAO层的所有方法 -->
    38             <tx:method name="*" read-only="false"/>
    39         </tx:attributes>
    40     </tx:advice>
    41     
    42     <!-- AOP配置:配置切入点表达式 -->
    43     <aop:config>    <!-- 第一个*表示返回值类型;第二个*表示service层下的所有接口实现类;第三个*表示每个接口实现类下的所有方法 -->
    44         <aop:pointcut expression="execution(* com.shore.service.impl.*.*(..))" id="pt"/>
    45         <aop:advisor advice-ref="transactionAdvice" pointcut-ref="pt"/>
    46     </aop:config>
    47 </beans>

    测试类

     1 package com.shore.test;
     2 
     3 import org.junit.Test;
     4 import org.springframework.context.ApplicationContext;
     5 import org.springframework.context.support.ClassPathXmlApplicationContext;
     6 
     7 import com.shore.entity.User;
     8 import com.shore.service.IUserService;
     9 
    10 /**
    11  * @author DSHORE/2019-11-12
    12  *
    13  */
    14 public class MyTest {
    15     
    16     @Test  //添加
    17     public void testSaveUser() {
    18         ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    19         IUserService userService = (IUserService) context.getBean("userService");
    20         User user = new User();
    21         user.setName("王五");
    22         user.setAge(23);
    23         userService.save(user);
    24     }
    25 }

    测试结果图:

         测试成功

    2.2、第二种方式:连接池交给spring来管理

    【一部分配置写到hibernate中,一部分在spring中完成】

    User类、User.bhm.xml、测试类、DAO层与Service层的接口类和实现类的代码都不变(和第一种方式的代码一样);
    只有Spring的配置文件(beans.xml)和HIbernate的核心配置文件(hibernate.cfg.xml)的代码不一样,如下所示:

    Spring配置文件(beans.xml)

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     4     xmlns:aop="http://www.springframework.org/schema/aop"
     5     xmlns:tx="http://www.springframework.org/schema/tx"
     6     xsi:schemaLocation="
     7        http://www.springframework.org/schema/beans
     8        http://www.springframework.org/schema/beans/spring-beans.xsd
     9        http://www.springframework.org/schema/tx
    10        http://www.springframework.org/schema/tx/spring-tx.xsd
    11        http://www.springframework.org/schema/aop
    12        http://www.springframework.org/schema/aop/spring-aop.xsd">
    13 
    14     <!-- c3p0数据库连接池配置 -->
    15     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    16         <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    17         <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/school"></property>
    18         <property name="user" value="root"></property>
    19         <property name="password" value="root"></property>
    20         <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> 
    21         <property name="initialPoolSize" value="3"></property>
    22         <!--连接池中保留的最大连接数。Default: 15 -->
    23         <property name="maxPoolSize" value="100"></property>
    24         <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements
    25           属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
    26          如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
    27         <property name="maxStatements" value="200"></property>
    28         <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
    29         <property name="acquireIncrement" value="2"></property>
    30     </bean>
    31 
    32     <!-- Spring自动去读取Hibernate的配置文件(hibernate.cfg.xml) -->
    33     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    34         <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
    35         <property name="dataSource" ref="dataSource"></property>
    36     </bean>
    37 
    38     <!-- DAO层 -->
    39     <bean id="userDao" class="com.shore.dao.impl.UserDao">
    40         <property name="sessionFactory" ref="sessionFactory"></property>  <!-- 这里和下面的“配置事务管理器”处对接 -->
    41     </bean>
    42     
    43     <!-- service层 -->
    44     <bean id="userService" class="com.shore.service.impl.UserService">
    45         <property name="userDao" ref="userDao"></property>
    46     </bean>
    47     
    48     <!-- ############Spring声明式事务管理配置########### -->
    49     <!-- 配置事务管理器 -->
    50     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    51         <property name="sessionFactory" ref="sessionFactory"></property>
    52     </bean>
    53     
    54     <!-- 配置事务增强(针对DAO层) -->
    55     <tx:advice transaction-manager="transactionManager" id="transactionAdvice">
    56         <tx:attributes>  <!-- *代表DAO层的所有方法 -->
    57             <tx:method name="*" read-only="false"/>
    58         </tx:attributes>
    59     </tx:advice>
    60     
    61     <!-- AOP配置:配置切入点表达式 -->
    62     <aop:config>    <!-- 第一个*表示返回值类型;第二个*表示service层下的所有接口实现类;第三个*表示每个接口实现类下的所有方法 -->
    63         <aop:pointcut expression="execution(* com.shore.service.impl.*.*(..))" id="pt"/>
    64         <aop:advisor advice-ref="transactionAdvice" pointcut-ref="pt"/>
    65     </aop:config>
    66 </beans>

    Hibernate核心配置文件(hibernate.cfg.xml)

     1 <?xml version='1.0' encoding='utf-8'?>
     2 <!DOCTYPE hibernate-configuration PUBLIC
     3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     4         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
     5 
     6 <hibernate-configuration>
     7     <session-factory>
     8         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
     9         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    10         <property name="show_sql">true</property>
    11         <property name="format_sql">true</property>
    12         <property name="hbm2ddl.auto">update</property>
    13 
    14         <mapping resource="com/shore/entity/User.hbm.xml"/>
    15     </session-factory>
    16 </hibernate-configuration>

    测试结果图;

        测试成功

    2.3、第三种方式:Hibernate核心配置文件(hibernate.cfg.xml)全交给Spring来管理

    User类、User.bhm.xml、测试类、DAO层与Service层的接口类和实现类的代码都不变(和第一种方式的代码一样);
    只有Spring的配置文件(beans.xml)的代码不一样,并且删除HIbernate的核心配置文件(hibernate.cfg.xml),如下所示:

    Spring配置文件(beans.xml)

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     4     xmlns:aop="http://www.springframework.org/schema/aop"
     5     xmlns:tx="http://www.springframework.org/schema/tx"
     6     xsi:schemaLocation="
     7        http://www.springframework.org/schema/beans
     8        http://www.springframework.org/schema/beans/spring-beans.xsd
     9        http://www.springframework.org/schema/tx
    10        http://www.springframework.org/schema/tx/spring-tx.xsd
    11        http://www.springframework.org/schema/aop
    12        http://www.springframework.org/schema/aop/spring-aop.xsd" default-autowire="byName">
    13 
    14     <!-- c3p0数据库连接池配置 -->
    15     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    16         <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    17         <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/school"></property>
    18         <property name="user" value="root"></property>
    19         <property name="password" value="root"></property>
    20         <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> 
    21         <property name="initialPoolSize" value="3"></property>
    22         <!--连接池中保留的最大连接数。Default: 15 -->
    23         <property name="maxPoolSize" value="100"></property>
    24         <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements
    25           属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
    26          如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
    27         <property name="maxStatements" value="200"></property>
    28         <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
    29         <property name="acquireIncrement" value="2"></property>
    30     </bean>
    31 
    32     <!-- Spring自动去读取Hibernate的配置文件(hibernate.cfg.xml) -->
    33     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    34         <!-- c3p0的数据库连接池 -->
    35         <property name="dataSource" ref="dataSource"></property>
    36         <!-- Hibernate配置 -->
    37         <property name="hibernateProperties">
    38             <props>  <!-- 注意:这个是Spring配置文件,故下面的key要写全名,即:前面加上hibernate.xxxxxx -->
    39                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    40                 <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
    41                 <prop key="hibernate.show_sql">true</prop>
    42                 <prop key="hibernate.format_sql">true</prop>
    43                 <prop key="hibernate.hbm2ddl.auto">update</prop>
    44             </props>
    45         </property>
    46         <!-- Hibernate 映射文件的配置 -->
    47         <!-- Hibernate注解版 -->
    48         <!-- <property name="mappingDirectoryLocations">
    49             <list>
    50                 <value>classpath:com/bw/entity/</value>
    51             </list>
    52         </property> -->
    53         
    54         <!-- Hibernate XML版本配置 -->
    55         <property name="mappingLocations">
    56             <list>
    57                 <value>classpath:com/shore/entity/*.hbm.xml</value>
    58             </list>
    59         </property>
    60     </bean>
    61 
    62     <!-- DAO层 -->
    63     <bean id="userDao" class="com.shore.dao.impl.UserDao">
    64         <property name="sessionFactory" ref="sessionFactory"></property>  <!-- 这里和下面的“配置事务管理器”处对接 -->
    65     </bean>
    66     
    67     <!-- service层 -->
    68     <bean id="userService" class="com.shore.service.impl.UserService">
    69         <property name="userDao" ref="userDao"></property>
    70     </bean>
    71     
    72     <!-- ############Spring声明式事务管理配置########### -->
    73     <!-- 配置事务管理器 -->
    74     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    75         <property name="sessionFactory" ref="sessionFactory"></property>
    76     </bean>
    77     
    78     <!-- 配置事务增强(针对DAO层) -->
    79     <tx:advice transaction-manager="transactionManager" id="transactionAdvice">
    80         <tx:attributes>  <!-- *代表DAO层的所有方法 -->
    81             <tx:method name="*" read-only="false"/>
    82         </tx:attributes>
    83     </tx:advice>
    84     
    85     <!-- AOP配置:配置切入点表达式 -->
    86     <aop:config>    <!-- 第一个*表示返回值类型;第二个*表示service层下的所有接口实现类;第三个*表示每个接口实现类下的所有方法 -->
    87         <aop:pointcut expression="execution(* com.shore.service.impl.*.*(..))" id="pt"/>
    88         <aop:advisor advice-ref="transactionAdvice" pointcut-ref="pt"/>
    89     </aop:config>
    90 </beans>

    测试结果图:

        测试成功

        

    注意:

    如果测试过程中出现这个异常:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxxxx'..........

    出现这个异常的可能原因:jdk的版本太高,而我们的jar包的版本太低。

    解决方法:在Spring的配置文件(beans.xml)的头文件 包引用连接尾部加上  default-autowire="byName" 即可。(注:首先jar包要导齐,不能少,也不能重复导包,同个版本的jar包 导入两个或多个,可能不会出现异常;但,同个包导入两个不同版本,一定会出现异常)

    出现这个异常的详细解决方法:https://www.cnblogs.com/dshore123/p/11874754.html

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:https://www.cnblogs.com/dshore123/p/11844233.html

    欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    算法导论:堆排序
    地域划分
    字符串翻转
    lintcode:买卖股票的最佳时机 IV
    lintcode:买卖股票的最佳时机 III
    lintcode:买卖股票的最佳时机 II
    lintcode:买卖股票的最佳时机 I
    2016腾讯编程题:微信红包
    2016腾讯编程题:生成格雷码
    2016京东编程题:小东分苹果
  • 原文地址:https://www.cnblogs.com/dshore123/p/11844233.html
Copyright © 2011-2022 走看看