Java进阶知识25 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

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

posted @ 2019-11-12 18:27  DSHORE  阅读(...)  评论(... 编辑 收藏