Hibernate与Spring集成示例

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

    写了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,如需转载请自行联系原作者
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
25天前
|
人工智能 自然语言处理 Java
Spring 集成 DeepSeek 的 3大方法(史上最全)
DeepSeek 的 API 接口和 OpenAI 是兼容的。我们可以自定义 http client,按照 OpenAI 的rest 接口格式,去访问 DeepSeek。自定义 Client 集成DeepSeek ,可以通过以下步骤实现。步骤 1:准备工作访问 DeepSeek 的开发者平台,注册并获取 API 密钥。DeepSeek 提供了与 OpenAI 兼容的 API 端点(例如),确保你已获取正确的 API 地址。
Spring 集成 DeepSeek 的 3大方法(史上最全)
|
22天前
|
人工智能 Java API
支持 40+ 插件,Spring AI Alibaba 简化智能体私有数据集成
通过使用社区官方提供的超过 20 种 RAG 数据源和 20 种 Tool Calling 接口,开发者可以轻松接入多种外部数据源(如 GitHub、飞书、云 OSS 等)以及调用各种工具(如天气预报、地图导航、翻译服务等)。这些默认实现大大简化了智能体的开发过程,使得开发者无需从零开始,便可以快速构建功能强大的智能体系统。通过这种方式,智能体不仅能够高效处理复杂任务,还能适应各种应用场景,提供更加智能、精准的服务。
|
2月前
|
监控 Java Nacos
使用Spring Boot集成Nacos
通过上述步骤,Spring Boot应用可以成功集成Nacos,利用Nacos的服务发现和配置管理功能来提升微服务架构的灵活性和可维护性。通过这种集成,开发者可以更高效地管理和部署微服务。
331 17
|
2月前
|
人工智能 安全 Dubbo
Spring AI 智能体通过 MCP 集成本地文件数据
MCP 作为一款开放协议,直接规范了应用程序如何向 LLM 提供上下文。MCP 就像是面向 AI 应用程序的 USB-C 端口,正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 提供了一个将 AI 模型连接到不同数据源和工具的标准化方法。
727 12
|
2月前
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
684 12
|
2月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
101 8
|
2月前
|
人工智能 数据处理 C#
AI Dev Gallery:微软开源 Windows AI 模型本地运行工具包和示例库,助理开发者快速集成 AI 功能
微软推出的AI Dev Gallery,为Windows开发者提供开源AI工具包和示例库,支持本地运行AI模型,提升开发效率。
125 13
|
3月前
|
XML Java API
Spring Boot集成MinIO
本文介绍了如何在Spring Boot项目中集成MinIO,一个高性能的分布式对象存储服务。主要步骤包括:引入MinIO依赖、配置MinIO属性、创建MinIO配置类和服务类、使用服务类实现文件上传和下载功能,以及运行应用进行测试。通过这些步骤,可以轻松地在项目中使用MinIO的对象存储功能。
202 5
|
4月前
|
消息中间件 Java Kafka
什么是Apache Kafka?如何将其与Spring Boot集成?
什么是Apache Kafka?如何将其与Spring Boot集成?
143 5
|
4月前
|
消息中间件 Java Kafka
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
102 1

热门文章

最新文章