Hibernate与Spring集成示例

  1. 云栖社区>
  2. 博客>
  3. 正文

Hibernate与Spring集成示例

余二五 2017-11-21 13:10:00 浏览971
展开阅读全文

    写了MyBatis与Spring的集成,今天写写Hibernate与Spring的集成。以前是别人集成好了自己直接用,今天自己集成一下。与MyBatis学习笔记系列一样,本篇依然采用courseman数据库(数据库的创建请参见笔者博客:MyBatis入门示例),及ant来管理工程(对ant不熟悉的朋友请参见笔者的相关博客:ant的下载与安装ant入门示例,)。本示例的任务是根据教师ID读取教师记录(教师类和表结构请参见笔者博客:MyBatis的association示例)。

一、版本说明

      Spring:3.1.2。

      Hibernate:3.6.7.Final。

      本示例提供源码下载(点此进入源码下载页面),因此需要的jar包就不一一赘述。

二、Spring的配置

      配置文件(beans.xml)的内容如下:


  1. <?xml version="1.0" encoding="utf8"?> 

  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.     xmlns:context="http://www.springframework.org/schema/context" 

  7.     xsi:schemaLocation="  

  8.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  

  9.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  

  10.             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd  

  11.             http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd  

  12.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"  

  13.             default-autowire="byName" default-lazy-init="false"> 

  14.     

  15.   <!--本示例采用DBCP数据源,应预先把DBCP的jar包复制到工程的lib目录下。数据源配置如下--> 

  16.   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 

  17.      <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 

  18.      <property name="url" 

  19.                value="jdbc:mysql://localhost/courseman"/> 

  20.      <property name="username" value="courseman"/> 

  21.      <property name="password" value="abc123"/> 

  22.   </bean> 

  23.  

  24.   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 

  25.      <!--dataSource属性指定要用到的数据源,因此在Hibernate的  

  26.      核心配置文件中就无需再配置与数据库连接相关的属性--> 

  27.      <property name="dataSource" ref="dataSource"/> 

  28.      <!--指定Hibernate核心配置文件--> 

  29.      <property name="configLocation" value="resources/hibernate.cfg.xml"/> 

  30.   </bean>   

  31.  

  32. </beans> 

      需要注意的是,以上sessionFactory的配置有其特殊之处。它的class是org.springframework.orm.hibernate3.LocalSessionFactoryBean,此类实现了Srping中的一个接口org.springframework.beans.factory.FactoryBean,这个接口声明了一个方法getObject()。这意味着,当我们要引用sessionFactory这个bean的时候,返回的不是类LocalSessionFactoryBean的实例,而是此实例的getObject()方法的返回值。而LocalSessionFactoryBean对此方法的实现(实际上是从AbstractSessionFactoryBean继承而来),是返回了一个SessionFactory对象。也就是说,LocalSessionFactoryBean的实例是用来生成SessionFactory对象的工厂。

      这与MyBatis和Spring的集成是一样的(请参见笔者博文:MyBatis与Spring集成示例),看来天下乌鸦一般黑啊!不过这倒是减轻了我们的学习、记忆负担。所不同的是,MyBatis的SqlSessionFactoryBean(类似于LocalSessionFactoryBean)是MyBatis自己实现的,而LocalSessionFactoryBean是Spring实现的。原因是Spring 3未提供与MyBatis 3的集成,MyBatis只好自己亲自上阵了(相关信息英文请参见:http://www.mybatis.org/spring/index.html,中文请参见:http://www.mybatis.org/spring/zh/index.html)。

三、Hibernate的配置

      Hibernate的核心配置文件hibernate.cfg.xml的内容如下: 


  1. <?xml version='1.0' encoding='utf8'?> 

  2. <!--  

  3.   ~ Hibernate, Relational Persistence for Idiomatic Java  

  4.   ~  

  5.   ~ Copyright (c) 2010, Red Hat Inc. or third-party contributors as  

  6.   ~ indicated by the @author tags or express copyright attribution  

  7.   ~ statements applied by the authors.  All third-party contributions are  

  8.   ~ distributed under license by Red Hat Inc.  

  9.   ~  

  10.   ~ This copyrighted material is made available to anyone wishing to use, modify,  

  11.   ~ copy, or redistribute it subject to the terms and conditions of the GNU  

  12.   ~ Lesser General Public License, as published by the Free Software Foundation.  

  13.   ~  

  14.   ~ This program is distributed in the hope that it will be useful,  

  15.   ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY  

  16.   ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License  

  17.   ~ for more details.  

  18.   ~  

  19.   ~ You should have received a copy of the GNU Lesser General Public License  

  20.   ~ along with this distribution; if not, write to:  

  21.   ~ Free Software Foundation, Inc.  

  22.   ~ 51 Franklin Street, Fifth Floor  

  23.   ~ Boston, MA  02110-1301  USA  

  24.   --> 

  25. <!DOCTYPE hibernate-configuration PUBLIC  

  26.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  

  27.         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

  28.  

  29. <hibernate-configuration> 

  30.  

  31.     <session-factory> 

  32.  

  33.         <!-- 数据库方言 --> 

  34.         <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

  35.  

  36.         <!-- Enable Hibernate's automatic session context management --> 

  37.         <property name="current_session_context_class">thread</property> 

  38.  

  39.         <!-- Disable the second-level cache  --> 

  40.         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

  41.           

  42.         <!-- 打印输出执行的SQL语句 --> 

  43.         <property name="show_sql">true</property> 

  44.  

  45.         <mapping resource="resources/mappers/Teacher.hbm.xml" /> 

  46.          

  47.     </session-factory> 

  48.  

  49. </hibernate-configuration> 

       Spring还提供了一种配置方式,可代替hibernate.cfg.xml。配置如下(配置文件是工程根目录下的beans2.xml): 


  1. <?xml version="1.0" encoding="utf8"?> 

  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.     xmlns:context="http://www.springframework.org/schema/context" 

  7.     xsi:schemaLocation="  

  8.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  

  9.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  

  10.             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd  

  11.             http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd  

  12.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"  

  13.             default-autowire="byName" default-lazy-init="false"> 

  14.     

  15.   <!--本示例采用DBCP数据源,应预先把DBCP的jar包复制到工程的lib目录下。数据源配置如下--> 

  16.   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 

  17.      <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 

  18.      <property name="url" 

  19.                value="jdbc:mysql://localhost/courseman"/> 

  20.      <property name="username" value="courseman"/> 

  21.      <property name="password" value="abc123"/> 

  22.   </bean> 

  23.  

  24.   <!--SessionFactory的另一种配置方式。这种方式可取代Hibernate的核心配置文件,因为如以下配置所示,  

  25.   Hibernate的各种属性、实体映射文件等,都可以用这种方式配置--> 

  26.   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 

  27.      <!--dataSource属性指定要用到的连接池--> 

  28.      <property name="dataSource" ref="dataSource"/> 

  29.      <!--指定要用到的实体映射文件--> 

  30.      <property name="mappingResources"> 

  31.           <list> 

  32.              <value>resources/mappers/Teacher.hbm.xml</value> 

  33.           </list> 

  34.      </property> 

  35.      <!--配置Hibernate的属性--> 

  36.      <property name="hibernateProperties"> 

  37.         <value> 

  38.            <!--数据库方言--> 

  39.            hibernate.dialect=org.hibernate.dialect.MySQLDialect  

  40.            <!-- 打印输出执行的SQL语句 --> 

  41.            hibernate.show_sql=true 

  42.         </value> 

  43.      </property> 

  44.   </bean> 

  45.  

  46. </beans>  

       教师实体映射文件内容如下: 


  1. <?xml version="1.0"?> 

  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.abc.domain"> 

  7.  

  8.     <class name="Teacher" table="TEACHER"> 

  9.         <id name="id" type="java.lang.Integer" column="ID"> 

  10.             <generator class="native"/> 

  11.         </id> 

  12.         <property name="name"/> 

  13.         <property name="gender"/> 

  14.         <property name="researchArea" column="RESEARCH_AREA"/> 

  15.         <property name="title"/>          

  16.     </class> 

  17.  

  18. </hibernate-mapping> 

 四、执行类

      执行类(HibernateSpringDemo.java)的代码如下。 


  1. package com.demo;  

  2.  

  3. import org.springframework.context.ApplicationContext;  

  4. import com.abc.domain.Teacher;  

  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  

  6. import org.hibernate.SessionFactory;  

  7. import org.hibernate.Session;  

  8.  

  9.  

  10. public class HibernateSpringDemo  

  11. {  

  12.     private static ApplicationContext ctx;  

  13.       

  14.     static 

  15.     {  

  16.         //在类路径下寻找resources/beans.xml文件  

  17.         ctx = new ClassPathXmlApplicationContext("resources/beans.xml");  

  18.     }  

  19.       

  20.       

  21.     public static void main(String[] args)  

  22.     {  

  23.         //从Spring容器中请求SessionFactory  

  24.         SessionFactory factory =   

  25.                (SessionFactory)ctx.getBean("sessionFactory");  

  26.  

  27.         Session session = factory.openSession();  

  28.    

  29.         //读取id为1的教师。  

  30.         Teacher teacher = (Teacher)session.get(Teacher.class1);  

  31.  

  32.         if(teacher != null)  

  33.         {  

  34.             System.out.println("姓    名: " + teacher.getName());  

  35.             System.out.println("研究方向: " + teacher.getResearchArea());  

  36.         }  

  37.  

  38.         else 

  39.         {  

  40.             System.out.println("未找到!");  

  41.         }  

  42.           

  43.         session.close();  

  44.        

  45.     }  

  46.  

       修改ant的build.xml文件的run target,指定此类为执行类。


  1. <target name="run" depends="compile"> 

  2.       <!--指定HibernateSpringDemo为要运行的类--> 

  3.       <java fork="true" classname="com.demo.HibernateSpringDemo" 

  4.       classpathref="library"> 

  5.         <classpath path="${targetdir}"/> 

  6.       </java> 

  7. </target>   

 

执行结果如下:

五、可能会遇到的错误

      1、缺少javassist包

      对于需要的jar包,笔者并没有一次性把Spring和Hibernate提供的所有jar包全部用上,而是根据编译、运行时报出的找不到类的异常信息,找到相关的jar包,然后再复制到工程的lib目录下。然而,在编程过程中,却遇到了这个错误:java.lang.ExceptionInInitializerError,内嵌的异常是:org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]。上网查询,才得知是少了javassist包。感到奇怪的是,这次却没有报找不到类的异常信息。Hibernate发布包下有个lib目录,存放着Hibernate的jar包。它有个required(必需的)子目录,javassist包就在此目录下。既然是必需的,那就把此目录下的jar包全部用上吧,免得再出错后又得花上不少时间来排错。

      2、字符集问题

      hibernate.cfg.xml的编码本为utf-8,添加中文注释后报错:Could not parse configuration。把编码改为utf8或gbk后即可解决此问题。对于这个问题,Spring、MyBatis和ant,都是一个德行(请参见笔者博文&ldquo;MyBatis与Spring集成示例&rdquo;中的第五部分可能会遇到的错误中的&ldquo;2、字符集问题&rdquo;)。










本文转自 NashMaster2011 51CTO博客,原文链接:http://blog.51cto.com/legend2011/963649,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
余二五
+ 关注