【Spring八】Spring与Hibernate整合

2023-11-04

Hibernate所需元素:
三要素:实体类,*.hbm.xml,hibernate.cfg.xml
Spring所需元素:
applicationContext.xml
hibernate在操作数据库时,使用sessionFactory.openSession()来增删改查,并通过session来开启事务。
与spring整合时,事务的管理交给了spring,利用面向切面的思想来操作事务。
在spring的配置文件中引入sessionFactory,由于没法直接将sessionFactory注入,因为没有提供构造方法和set方法,获取回忆hibernate操作时,获取sessionFactory通过的是从hibernate.cfg.xml配置文件获取:
SessionFactory   sessionFactory   = configuration.buildSessionFactory();
那么在Spring的配置文件中,该如何注入SessionFactory呢?
通过一个中间类:LocalSessionFactoryBean
详细代码:
1.关于hibernate相关的配置文件:
hibernate操作的实体类为Classes班级实体类:
①Classes.hbm.xml<->Classes.java
②hibernate.cfg.xml
2.Spring配置文件:
applicationContext.xml:
< beans  xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx= "http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
          http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"  >
      <!--
      要为 Hibernate提供SessionFactory,有两种方式获取SessionFactory:
          1.根据hibernate.cfg.xml的配置文件来获取,由于在该配置文件中配置了连接数据库的相关信息,
               所以这种方式不需要我们获取数据源,自动在内部完成。
          2.手动根据properties文件获取数据源,然后再将数据源注入。
          
      由于不能直接获取SessionFactory,因为SessionFactory不具备 di的特征(构造方法和set方法不满足),所以 Spring提供了一个额外的类:LocalSessionFactoryBean,它既有 hibernate 中sessionFactory中的功能
     又有spring中DI的特点
       -->
     
      <!--方法一  直接根据hibernate的配置文件来获取  -->
      < bean  id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
            <property name= "configLocation">
                <value> classpath:hibernate.cfg.xml</value >
            </property>
      </ bean  >
     
      <!-- 方法二  自行获取数据源(先加载properties文件,然后获取数据源),然后将数据源注入 -->
      < bean
            class= "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
            <property name= "locations">
                <value> classpath:jdbc.properties</value >
            </property>
      </ bean  >
      < bean  id="dataSource" destroy-method="close"
            class= "org.apache.commons.dbcp.BasicDataSource" >
            <property name= "driverClassName" value="${jdbc.driverClassName}" />
            <property name= "url" value ="${jdbc.url}" />
            <property name= "username" value="${jdbc.username}" />
            <property name= "password" value="${jdbc.password}" />
      </ bean  >
      <!-- 将获得的数据源注入到sessionFactory中-->
      < bean  id="sessionFactory1" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
            <property name= "dataSource" ref ="dataSource"/>
          <property name= "mappingResources">
            <list>
              <value> cn/itheima03/spring/ hibernate/transaction/domain/Classes.hbm.xml </value>
            </list>
          </property>
          <property name= "hibernateProperties">
            <value>
             hibernate.dialect=org.hibernate.dialect.MySQLDialect
            </value>
          </property>
      </ bean  >
     
      <!-- ===================================================== -->
     
      <!-- 需要注入sessionFactory  -->
      < bean  id="classesDao" class="cn.itheima03.spring.hibernate.transaction.dao.impl.ClassesDaoImpl" >
            <property name= "sessionFactory">
                <ref bean= "sessionFactory1"/>
            </property>
      </ bean  >
     
      < bean  id="classesService" class="cn.itheima03.spring.hibernate.transaction.service.impl.ClassesServiceImpl" >
            <property name= "classesDao">
                <ref bean= "classesDao"/>
            </property>
      </ bean  >
     
      <!-- 引入hibernate实现的事务管理,注意使用的sessionFactory要和classDao中注入的是同一个! -->
      < bean  id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" >
            <property name= "sessionFactory">
                <ref bean= "sessionFactory1"/>
            </property>
          
      </ bean  >
     
      <!-- 配置目标类的哪些方法使用什么样的事务 -->
      < tx:advice  id="tx" transaction-manager="transactionManager" >
            <tx:attributes>
                <tx:method name= "save*" read-only ="false"/>
            </tx:attributes>
      </ tx:advice  >
     
      < aop:config  >
            <aop:pointcut expression="execution(* cn.itheima03.spring.hibernate.transaction.service.impl.ClassesServiceImpl.*(..))" id ="perform"/>
            <aop:advisor advice-ref="tx" pointcut-ref= "perform"/>
      </ aop:config  >
</ beans >
其他代码:
//继承 HibernateDaoSupport
public  class ClassesDaoImpl extends HibernateDaoSupport implements ClassesDao{
      @Override
      public  void saveClasses(Classes classes) {
            this.getHibernateTemplate().save(classes);
     }
}
====================================
public  class ClassesServiceImpl implements ClassesService{
      private  ClassesDao classesDao;
      public  ClassesDao getClassesDao() {
            return classesDao ;
     }
      public  void setClassesDao(ClassesDao classesDao) {
            this.classesDao = classesDao;
     }
      public  void saveClasses(Classes classes){
            this.classesDao .saveClasses(classes);
     }
}
====================================
public  class ClassesServiceTest {
      @Test
      public  void testSaveClasses(){
          ApplicationContext context =  new ClassPathXmlApplicationContext("cn/itheima03/spring/hibernate/transaction/config/applicationContext.xml" );
          ClassesService classesService = (ClassesService) context.getBean( "classesService"  );
          Classes classes =  new Classes();
          classes.setCname(  "aa");
          classesService.saveClasses(classes);
     }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Spring八】Spring与Hibernate整合 的相关文章

随机推荐

  • 常见的【内存泄漏】姿势

    关注公众号 高性能架构探索 第一时间获取干货 回复 pdf 免费获取计算机经典书籍 本文节选自文章 内存泄漏 原因 避免以及定位 本文总结常见内存泄漏的几种方式 留意到这几点 可以避免95 以上的内存泄漏 未释放 这种是很常见的 比如下面的
  • UE5 AddYawInput踩坑

    在UE5内使用AddYawInput蓝图节点 发现我输入的值和旋转的值完全不匹配 总是扩大了2 5倍 无奈去看源码 发现并不是你输入多少值就旋转多少值 如果项目设置里EnableLegacyInputScales为真 那么还会乘以一个Yaw
  • centos安装 TA-Lib

    奇葩问题 问题一 gcc 编译器未安装 问题二 command gcc failed with exit status 1 问题三 Traceback most recent call last File run1 py line 3 in
  • 【代码随想录】数组——二分查找相关题目

    int middle left right left 2 防止溢出 等同于 left right 2 35 搜索插入位置 如果目标值不存在于数组中 返回它将会被按顺序插入的位置 这个要求自己没法实现 自己实现的会溢出 当考虑left不行时
  • 如何深度理解整体架构设计?

    一 什么是架构和架构本质 在软件行业 对于什么是架构 都有很多的争论 每个人都有自己的理解 此君说的架构和彼君理解的架构未必是一回事 因此我们在讨论架构之前 我们先讨论架构的概念定义 概念是人认识这个世界的基础 并用来沟通的手段 如果对架构
  • STM32CubeMX简单配置流程

    文章目录 前言 1 创建工程 2 创建STM32F103C8Tx系列工程 3 首先配置系统下载口 STLINK 4 配置外部时钟 5 配置相应功能 6 系统时钟配置 7 工程设置1 8 工程设置2 前言 借此平台记录一些以前保存的资料 防止
  • flask+云服务器 公网IP无法访问的问题

    最近做一些工作涉及到了flask的使用 写了一个简单的程序后 自己的云服务器公网IP一直无法访问 解决这个问题费了我好长时间 我自己用的是阿里云服务器 系统是centos 我在网上找到了几种说法 有人说是端口的问题 网上最多的说法是自己访问
  • C/C++安全编程规范

    一 安全编程概述 1 安全编程的目的 安全编程是一种软件开发方法 目的是通过采取具体措施来减少程序中存在的安全漏洞和黑客攻击的可能性 确保软件在运行过程中不会遭受攻击或泄露敏感信息 2 在进行安全编程时 需要遵循的安全最佳实践和规范 2 1
  • Rocketmq-- RocketMQ4.X基础介绍

    一 阿里开源消息队列 RocketMQ4 x介绍和新概念讲解 Apache RocketMQ作为阿里开源的一款高性能 高吞吐量的分布式消息中间件 1 1 特点 支持Broker和Consumer端消息过滤 支持发布订阅模型 和点对点 支持拉
  • Excel Row函数和Rows函数的使用方法,含Row(A:A)与Row(1:1)实例

    在 Excel 中 Row函数用于返回单元格的行号 Rows函数用于返回数组或引用单元格的行数 如果Row函数省略参数 默认返回公式所在单元格的行号 Rows函数不能省略参数 Rows函数常与Indirect函数 Index函数 If函数
  • 20230314-近视的小张

    1 题目名称 近视的小张 时间限制 1000ms内存限制 256M 题目描述 小张和他的 M 个朋友来到了一个十分神奇的地方 在这里有 N 个 柱子 对于每个 1 lt i lt N 第 i 个柱子都有两个属性 H i P i H i 表示
  • tasklet与workqueue的区别及底层实现区别

    softirq和tasklet都属于软中断 tasklet是softirq的特殊实现 workqueue是普通的工作队列 1 softirq 软中断支持SMP 同一个softirq可以在不同的CPU上同时运行 softirq必须是可重入的
  • Zabbix 如何动态执行监控采集脚本

    在使用Zabbix自定义脚本采集监控数据的时候 通常会遇到以下一些问题 服务器扩容之后 监控脚本如何部署到新的服务器上 监控脚本需要修改时 如何自动修改所有相同的监控脚本 如何备份监控采集脚本避免因服务器异常后丢失 新部署自定义监控 如何避
  • 能通过一张照片(2D)得到3D的模型吗?

    如下内容已经整理成 PDF 很好奇其实如果将人眼所看到的画面保存下来 拍照 人类是可以感知照片内的各个物体 是不是可以理解成这是一种2D到3D认知的转换 作者 知乎用户 链接 https www zhihu com question 529
  • win7蓝屏报错:STOP:0x0000007E

    报错环境 win 7 报错信息 STOP 0x0000007E 解决办法 0X0000007E代码的意思是电脑中病毒了或是电脑内存条出现了问题 电脑中病毒问题怎么处理 2 1如果是电脑中病毒 开机按电脑上的F8键 在电脑开机菜单栏找到 安全
  • 经典网络LeNet-5介绍及代码测试(Caffe, MNIST, C++)

    LeNet 5 包含7个层 layer 如下图所示 输入层没有计算在内 输入图像大小为32 32 1 是针对灰度图进行训练和预测的 论文名字为 Gradient Based Learning Applied to Document Reco
  • 为什么街头篮球总提示服务器维护,我玩街头篮球,但这几天它总是说连接不上服务器怎么回事?...

    我玩街头篮球 但这几天它总是说连接不上服务器怎么回事 來源 互聯網 2010 04 26 07 19 32 評論 分類 遊戲 gt gt 網絡遊戲 gt gt 街頭籃球 問題描述 我下载了补丁 參考答案 无法连接服务器 情况屡见不鲜 不巧
  • 如何应急响应

    应急响应事件分类 大致可以分为三类 1 勒索病毒 勒索病毒危害不言而喻 一旦中了勒索病毒 几乎很难破解 只能通过重装系统 数据备份恢复或者缴纳相应被勒索的比特币支付进行病毒解除 仍有一种比较渺茫的方式进行病毒解除 那就是溯源到攻击者 通过法
  • Expanding Low-Density Latent Regions for Open-Set Object Detection

    Expanding Low Density Latent Regions for Open Set Object Detection CVPR2022 Code https github com csuhan opendet2 这篇文章认为
  • 【Spring八】Spring与Hibernate整合

    Hibernate所需元素 三要素 实体类 hbm xml hibernate cfg xml Spring所需元素 applicationContext xml hibernate在操作数据库时 使用sessionFactory open