Hibernate系列---(二)主键生成策略&持久化类状态&一级缓存&事务

一小时搭建SpringBoot+Vue3健身管理系统:从零到一的全栈CRUD实战 前后端分离架构是现代Web应用开发的主流模式,其核心在于关注点分离:后端专注于数据处理与业务逻辑,通过RESTful API提供服务;前端则负责用户界面与交互体验。这种模式通过定义清晰的接口契约,实现了前后端的并行开发与高效协作。在技术实现上,SpringBoot以其快速启动和约定大于配置的特性,极大地简化了后端服务的开发与部署;而Vue3凭借其组合式API和响应式系统,为构建动态、高性能的前端应用提供了强大支持。结合Element Plus组件库,可以快速搭建出美观且功能丰富的管理界面。这种技术组合的价值 阅读详情

一、Hibernate持久化类的编写规则

持久化类:

一个Java对象与数据库的表建立了映射关系,那么这个类在hibernate中成为持久化类

编写规则:

  • 对持久化类提供一个无参的构造方法(Hibernate底层需要使用反射生成实例)
  • 属性为private,对私有属性提供public的get和set方法(Hibernate中获取,设置对象的值)
  • 对持久化类提供一个唯一标识OID与数据库主键对应(Java中通过对象地址区分是否是同一个对象,数据库通过主键值确定是否是同一个纪录,Hibernate通过持久化类的OID的属性区分是否是同一个对象)
  • 持久化类不能使用final进行修饰(如为final,则load方法无法返回代理对象,因为不能继承这个类进行代理。此时load和get方法一致)

二、主键生成策略

2.1 主键分类

  • 自然主键:主键本省就是表中所用的字段,即实体中的一个具体的属性

  • 代理主键:主键本省不是表中的字段,即不是实体中某个具体的属性

使用代理主键较好,方便后期修改属性

2.2 主键的生成策略

在Hibernate中,id元素的子元素用于生成持久化类的对象的主键生成策略

<!-- 主键生成策略 -->
     			<generator class="native"></generator>

hibernate提供了多种主键生成策略:

increment :
Hibernate中的自动增长机制,适用于short、int、long类型的主键。在单线程程序中使用。

identity :
数据库底层的自动增长机制,适合short、int、long类型的主键

sequence :
采用序列方式,适用于short、int、long类型的主键

uuid :
采用Hibernate中随机方式生成字符串主键,适用于字符串类型主键

native :
本地策略,在identity和sequence之间进行自动切换

assigned :
Hibernate不管理外键,需用户设置

foreign :
外部的,一对一的关系映射下使用

三、持久化类的三种状态

3.1 瞬时态(transient)

瞬时态:没有唯一标识OID,没有被session管理

3.2 持久态(persistent)

持久态:有唯一标识OID,被session管理

3.3 托管态(detached)

托管态:有唯一标识OID,没有被session管理

3.4 状态列子:

package com.hibernate.user.demo;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.hibernate.utils.HibernateUtils;

/**
 * hibernate测试案例
 * 
 * @author cf
 *
 */
public class HibernateTestDemo01 {

	@Test
	// 保存用户
	public void demo01() {
		//获取连接
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		// 执行代码
		User user = new User(); //瞬时态对象:无OID,无session管理
		user.setName("星星");
		
		Serializable id = session.save(user); //持久态对象:有OID,被session管理
		
		session.get(User.class, id);
		
		// 事务提交
		transaction.commit();
		//资源释放
		session.close();
		
		System.out.println(user);//托管态对象:有OID,无session管理
	}
}

3.5 持久态对象特征:

持久态对象可以自动更新数据库

@Test
// 自动更新数据库
public void demo02() {
	//获取连接
	Session session = HibernateUtils.openSession();
	Transaction transaction = session.beginTransaction();
	// 执行代码
	User user = session.get(User.class, 1);
	user.setEmail("123456789@qq.com");
	user.setPassword("654321");
	user.setTelephone("13388888888");
	//session.update(user);  自动更新,此句可以省略
	
	// 事务提交
	transaction.commit();
	//资源释放
	session.close();
}

结果如下:
在这里插入图片描述
以上代码再重复执行一次,结果如下:

在这里插入图片描述
并无更新,仅执行查询。

底层原理为一级缓存,下一节介绍

四、一级缓存

Hibernate提供了一级缓存和二级缓存来提供应用程序的性能。本章先介绍一级缓存。

一级缓存:
session对象保存了一级缓存,默认情况下启用。不可用于整个应用程序,生命周期同session一致。

@Test
	// 一级缓存
	public void demo03() {
		// 获取连接
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		// 执行代码
		//第一次查询user
		User user = session.get(User.class, 1); 
		System.out.println(user);
		
		//第二次查询user
		User user1 = session.get(User.class, 1);
		System.out.println(user1);

		//判断两次user是否相同
		System.out.println(user == user1);
		// 事务提交
		transaction.commit();
		// 资源释放
		session.close();
	}

结果如下:
在这里插入图片描述
可以看出,结果查询语句仅执行了一次,第二次从一级缓存中取出。

使用session.clear()可以清空一级缓存

五、事务

事务具有ACID属性(原子性,一致性,隔离性和持久性)。

5.1 设置事务的隔离级别:

在核心配置文件hibernate.cfg.xml中使用一下语句配置隔离级别

<!-- 事务隔离级别 
		hibernate.connection.isolation - 4
		1 - Read uncommitted isolation
		2 - Read committed isolation
		4 - Repeatable read isolation
		8 - Serializable isolation
	-->
	<property name="hibernate.connection.isolation">4</property>

5.2 Service层使用事务

dao层和Service层需保证连接对象是同一个

1.HibernateUtils.java中增加getCurrentSession方法

package com.hibernate.utils;
/**
 * Hibernate的工具类
 * @author cf
 *
 */

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
	public static final Configuration cfg;
	public static final SessionFactory sf;

static {
	cfg = new Configuration().configure();
	sf = cfg.buildSessionFactory();
}

public static Session openSession() {
	return sf.openSession();
}

public static Session getCurrentSession() {
	return sf.getCurrentSession();
}
}

2.核心配置文件增加以下配置

  <!-- 配置当前线程绑定的session -->
   <property name="hibernate.current_session_context_class">thread</property>

此时session在线程结束后会自动关闭,session.close()语句可以省略。

[F2F] Java后端AI大纲 120 道 Java 后端 AI 方向面试题,按六个类别整理:数据与接口契约、高并发与流式响应、状态与架构、性能安全成本、工程化与可观测性、Function Calling 与 RAG。排版沿用 MySQL 经典 50 题的做法,第 3 节把试卷整份摊开供自测,第 4 节按同一套全局编号给参考答案:每题一句一针见血的结论,加 2~4 条能落到白板上的要点,写到具体类名、注解、配置项和阈值。 阅读详情

相关推荐

SYSU-MM01数据集评估避坑指南:从RGB/IR图像理解到Python评估脚本调优

本文详细解析了SYSU-MM01数据集在跨模态行人重识别(ReID)评估中的关键技巧与常见陷阱。从RGB/IR图像理解到Python评估脚本优化,提供了数据评估模式选择、single-shot/multi-shot差异分析、特征文件处理规范等实用指南,帮助研究者避开指标异常问题,提升评估效率与准确性。

weixin_29044713的博客 196

Persistent service

<br />一般情况下,程序运行时,数据和对象是有效的;当程序结束的时候,就会消失。如果数据要被永久的存储,那么在ABAP 对象里就使用persistent services.这些服务就写当前的属性值到数据库里,一收到另外一个请求就将他们的值从表里导出来,写到一个永久服务里,这个永久服务就是使用OPEN SQL的接口。<br />为一个对象使用persistent service,就需要使用persistent class, persistent class是唯一的,需要包含key attributes.使

george_506的专栏 1324

深入解析Gerber RS274X文件格式:从基础语法到实战应用

本文深入解析PCB制造的核心标准Gerber RS274X文件格式,详细介绍了其基础语法、坐标系统、功能码以及嵌入式光圈定义等关键特性。通过实战案例演示了如何解析和手写Gerber指令,并总结了常见错误与调试技巧,帮助PCB工程师掌握这一与制造工厂沟通的“通用语言”,确保设计准确无误地转化为实体电路板。

weixin_29252171的博客 94

【Hibernate(二)】持久化类、主键生成策略和一级缓存

1.2 持久化类的编写规则 1.2.1 持久化类的概述 什么是持久化类 持久化:将内存中的一个对象持久化到数据库中过程。Hibernate框架就是用来进行持久化的框架。 持久化类:一个Java对象与数据库的表建立了映射关系,那么这个类在Hibernate中称为是持久化类。 持久化类 = Java类 + 映射文件 1.2.2 持久化类的编写规则 持久化类的编写规则 对持久化类提供一个...

风信子 313

硬件级Dalvik字节码粒度无痕HOOK及VMP取址码定位分析

2.通过硬件读写断点的输出信息 可知pc寄存器就是art解释器的取码地址 直接硬件执行断点在这个pc 即可直接trace所有的smali执行流 通杀所有机型系统。本文即将探讨的是 如何在硬件级别实现dalvik bytecode粒度的无痕拦截技术 并实现鼠标点击一键hook 指哪儿打哪儿 感受 button power 的强大魅力!4.由于硬件断点是同步的 断下后可随时硬件dump下这一瞬间的app内存映像 写入unicorn的内存模拟执行。解释器在解释执行前必会读取内存中的bytecode。

2503_90751789的博客 1085

2021.11.23 Covins 多机器人单目协同建图 跑Euroc数据集 更新

近日,一直在调试如何使用Covins跑通数据集,因为是初学者,所以很多bug出来的时候原理都不懂,只能复制——百度——尝试解决的过程。 现分享一下近日的结果以及与Covins作者帮助解答的一些问题。 使用代码行跑依次跑Euroc多数据集 这里的意思是使用作者提供的covins_examples文件夹中的euroc_examples_mh123_vigba.sh文件,这个文件是将三个Euroc数据集依次运行,跑完第一个数据集,第二个数据集运行的时候在第一个数据集生成地图的基础上继续绘制,由于我只下载了两个数据

qq_42614598的博客 2474

hibernate的主键生成策略&一级缓存&事务管理学习笔记

持久化 持久化:将内存中的一个对象持久化到数据库的过程。Hibernate框架就是用来持久化的框架。 持久化类:一个java对象与数据表建立了映射关系,那么这个类在Hibernate中称为持久化类。   持久化类= java类  +   映射文件 持久化类的编写规则 1.提供无参构造                                                      ...

malaganguo的博客 419

开源分享:苹果群控手机源代码解析与实战

本文介绍了苹果设备群控的基本原理和实现方法,重点解析了基于Python+Appium的群控系统构建。主要内容包括:1)设备连接管理技术(USB/Wi-Fi);2)自动化控制方式(WDA/AppleScript/Appium);3)实战演示了通过Python脚本实现多设备同时控制,涵盖环境配置、代码解析和功能说明;4)提出了多线程、图像识别等优化方向。文章为开发者提供了快速上手的群控方案,适用于自动化测试、批量管理等场景,并推荐了相关开源项目参考。

2403_88540309的博客 1344

NUMBER类型精度与Hibernate中映射主键ID关系(原创)

首先了解一下ORACLE 10G中NUMBER类型。 NUMBER (precision,scale) precision表示数字中的有效位。如果没有指定precision的话,Oracle将使用38作为精度。 scale表示数字小数点右边的位数,scale默认设置为0.如果把scale设成负数,Oracle将把该数字取舍到小数点左边的指定位数。如果需要小数位,一般设置成2或3   ...

sunwws的专栏 659

dify制作的工作流如何通过API调用

本文介绍了如何通过Python程序调用Dify工作流API实现数据处理功能。文章详细展示了workflow和chatflow的调用方法,包括参数设置和结果输出,并提供了一个完整的API调用工具代码示例。该工具可实现文本处理、成果查重、关键词生成等功能,支持通过Python脚本或Postman进行调用。核心代码包含API请求函数和批量处理函数,通过HTTP请求与Dify服务端交互,实现自动化数据处理流程。

hhue2007的专栏 934

Open3D 可视化(1)——简单可视化【2026最新版】

简单可视化,博客长期更新,本文最新更新时间为:2026年5月10日。

点云侠的博客 5685

Hibernate入门第五讲——Hibernate持久化类与主键生成策略

Hibernate持久化类什么是持久化类呢?在Hibernate中持久化类的英文名称是Persistent Object(简称PO),PO=POJO+hbm映射配置文件。 对于Hibernate中的PO,有如下编写规则: 必须提供一个无参数的public构造方法。 所有属性要用private修饰,对外提供public的get/set方法。 在PO类必须提供一个标识属性,让它与数据库中的主键对应,我

李阿昀的博客 5469

【产品】 产品设计:ID设计和MD设计详解

1、ID(Industry Design)工业设计 包含外观、材质、手感、颜色配搭,主要界面的实现与及色彩等方面的设计。 2、MD(Mechanical Design)结构设计 以手机为例: 前壳、后壳、手机的摄像镜头位置的选择、固定的方式、电池如何连接和手机的厚薄程度等。 如果是滑盖手机,如何让手机滑上去,怎样实现自动往上弹,SIM卡怎样插和拔的安排,这些都是手机结构设计的范畴。 繁...

产品线负责人 3万+

Spring Boot实战:构建赛事数据解析与管理系统

数据解析与结构化存储是后端开发中的常见需求,尤其在处理非结构化文本信息时。其核心原理是通过正则表达式、规则引擎或自然语言处理技术,从原始字符串中提取关键字段,并映射到数据库实体。这项技术的价值在于将杂乱信息转化为可查询、可分析的标准化数据,为上层应用提供可靠的数据支撑。在游戏赛事、日志分析、内容管理等应用场景中,数据解析能显著提升信息处理效率。本文以游戏赛事标题为例,详细演示了如何使用Spring Boot框架,结合JPA和自定义解析器,搭建一个完整的赛事数据管理后端系统,涵盖从数据库设计、接口开发到基础数

weixin_34205826的博客 826

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【课程设计】springboot车辆管理系统的设计与实现毕业设计源码031034

驾驶员:资料修改,车辆信息,出车记录,还车记录,首页 管理员:用户管理。车辆管理,品牌分类,出车记录,还车记录。车辆分类,登录

高级程序源的博客 877

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Spring Boot电商平台毕业设计:从架构到部署的完整实现指南

Web应用开发的核心在于构建稳定、可扩展的业务系统,其原理通常围绕MVC架构、RESTful API设计和数据库交互展开。这类技术能高效处理复杂业务逻辑,其价值在于提升开发效率、保障系统安全并优化性能,广泛应用于电商、社交、管理等各类互联网平台。在毕业设计场景中,一个典型的应用是开发一个功能完备的电商购物平台,这要求开发者综合运用后端框架、数据库设计和前端技术。本文以Spring Boot为例,详细解析了如何实现用户认证、商品管理、订单处理等核心模块,并提供了数据库设计、API开发及安全防护的工程实践。同时

weixin_30784501的博客 458

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【课程设计】springboot电影院售票与管理系统 毕业设计 011449

前台用户的功能如下: 登录:根据账号密码进行登录操作。 维护个人信息:用户因个人信息的变更可以随时修改自己注册信息。 浏览影片信息:用户可以根据电影类型浏览影片的信息,并选中某个影片查看详情,例如:影片编号、影片名称、影片类型、影院名称、上映时间、票价等。 浏览影院信息:用户可以根据电影类型浏览影院的信息,并选中某个影院查看详情,例如:影院编号、影院名称、影院地址、影院电话等。 浏览评论信息:选中某间电影可查看其用户的评论。 评论:用户可以根据自己的观点看法对相关电影进行评论。

WeiXin_DZbishe的博客 6594

【课程设计】(附源码)基于Android的校园综合服务App平台的设计 毕业设计181042

对于本校园综合服务App平台的设计来说,它主要是采用后台采用java语言、springboot框架,它是应用mysql数据库、Android等技术动态编程以及数据库进行努力学习和大量实践,并运用到了APP的建设中在整个系统的设计当中,具体根据网上校园综合服务App平台的现状来进行开发的,具体根据用户需求实现网上校园综合服务App平台网络化的管理,各类信息有序地进行存储,进入校园综合服务App平台页面之后,方可开始操作主控界面,系统功能包括管理员服务端:首页、站点管理(轮播图、公告栏)用户管理(管理员、

Biye_Design的博客 3666

2026年MySQL安装配置实战指南:从零部署到安全优化

很多开发者在初次接触MySQL时,常常被繁琐的下载、安装和配置过程劝退,尤其是在Windows环境下,从官网选择版本、配置环境变量到初始化服务,每一步都可能遇到意想不到的报错。网上资料虽然多,但往往版本过时或步骤不全,导致跟着教程走却卡在某个环节。 本文将为你提供一份 2026年最新、最全的MySQL安装配置实战指南 。无论你是刚入门数据库的新手,还是需要在本地快速搭建开发环境的老手,都能从零开始,手把手完成MySQL的下载、安装、配置、启动和基础使用。文章将覆盖Windows和Linux(通过Docker

weixin_33713503的博客 352

工作中使用到的单词(软件开发)

1.エイリアス   alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート   promote 促进,提升   开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................

sun0322 6万+

Hibernate笔记02_主键生成策略_一级缓存_事务管理

0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 持久化:将内存中的一个对象持久化到数据库的过程,Hibernate框架就是用来进行持久化的框架。 持久化类:一个Java对象与数据库的表建立了映射关系,那么这个类在Hibernate中称为持久化类。 持久化 = Java类 + 映射文件 1.2 持久化类的编写规则 对持久化提供一个无参的构造方法:HIbernate底层...

itzhouq的博客 346

Day43 Java框架 Hibernate框架(二)主键生成策略- -一级缓存- - 事务管理

一.持久化类的概述 持久化: 将内存中的一个对象持久化到数据库中的过程. Hibernate框架就是用来进行持久化的框架 持久化类: 一个Java对象与数据库的表建立了映射关系,那么这个类在Hibernate中称为是持久化类 编写规则: -1- 对持久化类提供一个无参数的构造方法 : Hibernate底层需要使用反射生成实例 -2-属性需要...

ambition 255

Spring教程(一)--入门&基本配置

一、Spring简介 1.1 Spring概述 Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Java 平台,它最初是由 Rod Johnson 编写的,并且于 2003 年 6 月首次在 Apache 2.0 许可下发布。 Spring 是轻量级的框架...

Double____C的博客 6102

Spring Boot教程(一)--实例入门

一、SpringBoot简介 Spring Boot是一个简化Spring开发的框架。用来监护spring应用开发,约定大于配置,去繁就简。 我们在使用Spring Boot时只需要配置相应的Spring Boot就可以用所有的Spring组件,简单的说,spring boot就是整合了很多优秀的框架,不用我们自己手动的去写一堆xml配置然后进行配置。从本质上来说,Spring Boot就是Spr...

Double____C的博客 3621

SSM整合实例--(四)条件搜索

一、条件搜索 商品条目一旦多了起来,就不能一页一页的翻找。需要设置条件,根据条件搜索条目。 二、代码实现 在原来的查找所有productList的功能基础上添加条件参数,设置条件查询。 2.1 JSP页面修改 product_list.jsp 添加 searchDiv 代码,如下图所示。为搜索前端页面展示 效果如下: 新增的div中对应的js代码: function resetSearch()...

Double____C的博客 2918

Mybatis(一)--基础教程

一、Mybatis MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 二、入门实例 2.1 环境搭建...

Double____C的博客 2438
上一篇: Hibernate系列---(一)入门及映射文件配置
下一篇: Hibernate系列---(三)表关系
Double____C
博客等级 码龄8年 92粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值