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