Hibernate执行流程分析及配置文详解

news2024/11/20 15:35:49

目录

1、Hibernate执行流程分析及配置文件详解

1)Configuration对象

2)ServiceRegistry对象(hibernate4的新特性)

3)SessionFactory对象

4)Session对象

5)Transaction对象

6)hibernate.cfg.xml配置详解

7)Student.hbm.xml配置详解

2、抽取HibernateUtils工具类

3、Session的常用方法详解(CRUD案例)


1、Hibernate执行流程分析及配置文件详解

Hibernate核心的API详解:

1)Configuration对象

Configuration类负责管理Hibernate的配置信息。包括如下内容:

    1)Hibernate运行的底层信息:

       数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。

    2)持久化类与数据表的映射关系(*.hbm.xml 文件)

创建Configuration 的两种方式:

    属性文件(hibernate.properties):

        Configuration cfg = new Configuration();

    Xml文件(hibernate.cfg.xml)(推荐使用)

         Configuration cfg = new Configuration().configure();

2)ServiceRegistry对象(hibernate4的新特性)

ServiceRegistry 是 Service 的注册表, 它为Service提供了一个统一的加载 / 初始化 / 存放 / 获取机制.

3)SessionFactory对象

1)Configuration对象根据当前的配置信息生成 SessionFactory 对象。SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存)。

      Configuration cfg = new Configuration().configure();

      SessionFactory sf = cfg.buildSessionFactory();

2SessionFactory是线程安全的。

3)SessionFactory是生成Session的工厂:

       Session session = sf.openSession();

4)构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory对象

4)Session对象

1)Session是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处。相当于 JDBC 中的 Connection。

2)持久化类与 Session 关联起来后就具有了持久化的能力。

3)是线程不安全的

4Session 类的方法:

     取得持久化对象的方法: get() load()

     持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()

     开启事务: beginTransaction().

     管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()

5)Transaction对象

1)代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。

   Transaction tx = session.beginTransaction();

2)常用方法:

commit():提交相关联的session实例

rollback():撤销事务操作

6)hibernate.cfg.xml配置详解

<hibernate-configuration>

<session-factory>

   <!-- 数据库连接配置 -->

   <property name="hibernate.connection.driver_class">

      com.mysql.jdbc.Driver

   </property>

   <property name="hibernate.connection.url">

      jdbc:mysql://localhost:3306/day14?useUnicode=true&amp;characterEncoding=utf-8

   </property>

   <property name="hibernate.connection.username">root</property>

   <property name="hibernate.connection.password">root</property>

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

   <property name="hibernate.dialect">

      org.hibernate.dialect.MySQL5InnoDBDialect

   </property>

   <!-- 显示执行的sql语句 -->

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

   <!-- 格式化sql语句 -->

   <property name="hibernate.format_sql">true</property>

   <!-- hibernate自动维护表 -->

   <property name="hibernate.hbm2ddl.auto">update</property>

   <!-- 对象关系映射的配置 -->

   <mapping resource="gz/itcast/entity/Student.hbm.xml" />

</session-factory>

</hibernate-configuration>

7)Student.hbm.xml配置详解

       

2、抽取HibernateUtils工具类

public class HibernateUtils {

   private static SessionFactory sessionFactory = null;

  

   static{

      Configuration config =

             new Configuration().configure();

      StandardServiceRegistry serviceRegistry

                = new StandardServiceRegistryBuilder()

             .applySettings(config.getProperties())

             .build();

      sessionFactory = config.buildSessionFactory(serviceRegistry);

   }

  

   public static Session getSession(){

      return sessionFactory.openSession();

   }

}

3、Session的常用方法详解(CRUD案例)

//演示CURD

public class Demo {

   //添加

   @Test

   public void testInsert(){

      Session session = HibernateUtils.getSession();

      Transaction tx = null;

      try{

          tx = session.beginTransaction();

          Student s = new Student();

          s.setId(3);

          s.setName("王五");

          s.setGender("");

          s.setAge(18);

         

          session.save(s);

        

          tx.commit();

      }catch(Exception e){

          e.printStackTrace();

          tx.rollback();

      }finally{

          session.close();

      }

   }

   //更新

   @Test

   public void testUpdate(){

      Session session = HibernateUtils.getSession();

      Transaction tx = null;

      try{

          tx = session.beginTransaction();

         

          Student s = new Student();

          s.setId(3);

          s.setName("陈六");

          s.setGender("");

          s.setAge(28);

         

          session.update(s);

         

          tx.commit();

      }catch(Exception e){

          e.printStackTrace();

          tx.rollback();

      }finally{

         session.close();

      }

   }

   //删除

   @Test

   public void testDelete(){

      Session session = HibernateUtils.getSession();

      Transaction tx = null;

      try{

          tx = session.beginTransaction();

         

          Student s = new Student();

          s.setId(3);

         

          session.delete(s);

         

          tx.commit();

      }catch(Exception e){

          e.printStackTrace();

          tx.rollback();

      }finally{

          session.close();

      }

   }

   //查询

   @Test

   public void testQuery(){

      Session session = HibernateUtils.getSession();

      Transaction tx = null;

      try{

          tx = session.beginTransaction();

         

          Student s = (Student)session.get(Student.class, 2);

          System.out.println(s);

         

          tx.commit();

      }catch(Exception e){

          e.printStackTrace();

          tx.rollback();

      }finally{

          session.close();

      }

   }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1641834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法打卡day41

今日任务&#xff1a; 1&#xff09;198.打家劫舍 2&#xff09;213.打家劫舍II 3&#xff09;337.打家劫舍III 4&#xff09;复习day16 198.打家劫舍 题目链接&#xff1a;198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街…

AttributeError: module ‘numpy‘ has no attribute ‘int‘.

问题描述 复现代码过程中遇到错误&#xff1a;AttributeError: module numpy has no attribute int. 错误代码行&#xff1a; self.sf np.int(data[sf][0,...].squeeze().cpu().numpy()) # scale factor 解决方案 这是因为在Numpy 1.2.0版本中就已经弃用了这个用法&#x…

探索动态内存开辟的奥秘

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 前言 开始之前&#xff0c;我们先来了解一下C/C中程序内存区域划分。 在C/C程序中&#xff0c;内存区域通常被划分为以下几个部分&#xff1a; 1.栈&…

【基础算法总结】滑动窗口一

滑动窗口 1.长度最小的字数组2.无重复字符的最长子串3.最大连续1的个数 III4.将 x 减到 0 的最小操作数 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&…

软件测试(实验五)——Jmeter的使用

目录 实验目的 一、使用JMeter演示取样器、监听器、配置元件、断言的使用&#xff1b; 1、取样器 2、监听器 3、配置元件的使用 ① 用户定义的变量 ②HTTP信息头管理器 ③HTTP请求默认值 ④CSV数据文件设置 4、断言 ①响应断言 ②JSON断言 ③断言持续时间 二、使用…

普通二维码打开微信小程序并且传递参数

实现方法&#xff1a; 【1】确保有一个企业级别的认证过的微信小程序 【2】有一个https并且备案过的域名 【3】进入微信后台“开发”-“开发设置”-“扫普通链接二维码打开小程序”-“添加” 官方文档&#xff1a;https://developers.weixin.qq.com/miniprogram/introduction/q…

C语言实验-学生信息管理系统

按以下菜单界面编写学生信息管理系统&#xff1b; 1&#xff09;录入学生信息首先输入学生人数&#xff0c;然后根据学生人数开辟动态数组&#xff1b; 2&#xff09;学生信息包括学号、姓名、性别、三门课成绩、总分&#xff1b;其中学号、姓名、 性别、三门课成绩是需要从键盘…

YOLO自研模块:多尺度轻量化卷积模块

目录 一、原理 二、代码 三、配置文件 一、原理 不同大小的卷积核,提取目标特征的特征尺度不同,所以通过使用不同大小卷积核的卷积来提取特征就可以保证获取到目标的多尺度特征。 借鉴YOLOv8中,将通道数进行划分的操作,在卷积的输入过程中为了减小参数量,将输入通道数…

截图时,VSCode屏幕泛白

问题如图所示&#xff1a; 放弃前摇&#xff0c;直接给出解决方案&#xff1a;换个主题即可。 实测&#xff0c;Light Modern 的色域正常&#xff0c;其他的没有经过测试。 出现这个问题的原因&#xff0c;大概率就是色彩空间不匹配。 HDR 内容是为了在支持 HDR 的显示设备上展…

H3C MSTP 实验

H3C MSTP 实验 实验拓扑 ​​ 实验需求 所有交换机上创建 Vlan10&#xff0c;Vlan20&#xff0c;Vlan30 和 Vlan40所有交换机之间的端口配置为 Trunk&#xff0c;并放行相关 VLAN按照图示分区域配置 MSTP&#xff0c;并配置主备根网桥 实验步骤 VLAN基础配置&#xff08;…

C++ 多态(二)

四、多态纯虚函数 纯虚函数是在C中用来定义抽象类的一种特殊函数。纯虚函数没有具体的实现&#xff0c;只有函数声明&#xff0c;它的作用是为派生类提供一个接口&#xff0c;让派生类必须实现这个函数。如果一个类中包含了纯虚函数&#xff0c;那么这个类就是抽象类&#xff…

史上最复杂的探测器嫦娥六号,如何采取人类首份月背样品? | 最新快讯

作者&#xff1a;LM-51D-YZ4D2&#xff0c;航天爱好者 今天&#xff0c;长征五号遥八火箭即将从海南文昌航天发射场点火起飞&#xff0c;把嫦娥六号探测器送入预定轨道。作为嫦娥五号的备份器&#xff0c;嫦娥六号继承了嫦娥五号的结构&#xff0c;又针对月球背面着陆进行了优化…

6.【Orangepi Zero2】localtime、asctime函数

【Orangepi Zero2】localtime、asctime函数 localtime、asctime localtime、asctime #include <time.h>struct tm *localtime(const time_t *timep); char *asctime(const struct tm *tm);localtime() 是 把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地…

批量视频剪辑新选择:一键式按照指定秒数分割视频并轻松提取视频中的音频,让视频处理更高效!

是否经常为大量的视频剪辑工作感到头疼&#xff1f;还在一个个手动分割、提取音频吗&#xff1f;现在&#xff0c;我们为你带来了一款全新的视频批量剪辑神器&#xff0c;让你轻松应对各种视频处理需求&#xff01; 首先&#xff0c;进入媒体梦工厂的主页面&#xff0c;并在板…

后台架构总结

前言 疫情三年&#xff0c;全国各地的健康码成为了每个人的重要生活组成部分。虽然过去一年&#xff0c;但是回想起来任然历历在目。 今天我就通过当时基于小程序的健康码架构&#xff0c;来给大家讲一下如何基于java&#xff0c;springboot等技术来快速搭建一个后台业务系统…

freeRTOS任务通知(1-17)

任务通知简介&#xff1a; def&#xff1a; 任务通知是用来通知任务的&#xff0c;任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。 任务通知的内存消耗比较小 1&#xff1a; 使用队列&#xff0c;信号量&#xff0c;时间标志组都需要另外创建结构体&#xff…

C++设计模式-创建型设计模式

设计模式 设计模式是什么 设计模式是指在软件开发中&#xff0c;经过验证的&#xff0c;用于解决在特定环境下&#xff0c;重复出现的&#xff0c;特定问题的解决方案&#xff1b;其实就是解决问题的固定套路。但是要慎用设计模式&#xff0c;有一定的工程代码量之后用它比较…

ue引擎游戏开发笔记(29)——实现第三人称角色随手柄力度进行移动

1.需求分析 角色可以随手柄力量大小进行走路和跑步&#xff0c;不动时保持角色停顿。 2.操作实现 1.思路&#xff1a;通过动画蓝图和动画混合实现角色移动和输入的联系。 2.建立动画蓝图和混合空间&#xff1a; 3.在混合空间中对角色移动进行编辑&#xff1a; 4.在蓝图中设定变…

HTML_CSS学习:浮动

一、浮动简介 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>浮动_简介</title><style>div{width: 600px;height: 400px;background-color: #1c80d9;}img{float:…

Java进阶【十三期】:【异常处理】 (抛出捕获异常、自定义异常处理)、处理异常的几种方式 【(File】文件路径操作、File文件处理的综合练习

文章目录 Java进阶【十三期】&#xff1a;异常处理一、异常基本介绍二、编译异常和运行异常三、总结 异常的作用异常的处理方式一、JVM默认的处理方式二、自己处理异常自己 处理的问题 三、总结 Throwable 成员方法抛出异常总结 异常练习自定义异常 FileFile 三个 构造方法File…