Hibernate三种状态和Session常用的方法

发布时间 - 2026-01-11 00:11:24    点击率:

我们知道hibernate的核心就是对数据库的操作,里面的核心接口就是org.hibernate.Session接口。要想对数据库操作我们就要理清楚对象在整个操作中的所属的状态(Transient,Persistent,Detached)。就像马士兵老师在视频中所说的,我们并不必死抠这些字眼,我们通过自己编写测试类就可以他们之间不同的区别。

其实三种状态各自的不必总结那么多,只是一个重要的地方就是Transient状态里面的对象是没有id的。

session中常用的方法是save(),update(),saveOrUpdate(),get(),load(),delete(),clear(),flush()这些

其中大学期间我其实对get和load方法都不是太熟悉,死记硬背才在考试中答题,现在想起完全没有这个必要。我们可以根据配置好的hibernate环境来进行junit测试。

首先我们进行get()方法进行测试。

这里我们首先建立一个实体类,StudentEntity.Java 和数据库中student所对应

package com.cwnu.entities; 
import javax.persistence.*; 
import java.io.Serializable; 
/** 
 * Created by yangy on 2015/12/19. 
 */ 
@Table(name = "student") 
@Entity 
public class StudentEntity implements Serializable{ 
 private int id; 
 private String name; 
 @Id 
 @Column(name = "id") 
 @GeneratedValue(strategy = GenerationType.AUTO) 
 private int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
 @Column(name = "name") 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
} 

junit类都是idea编译环境给我们配置好了,这里我们要注意,要使用getCurrentSession()来操作的话,我们首先要在Junit类中加上@Transaction注解,下面是相关的测试方法:

 @Test 
public void testGetOrLoad() { 
 Session session = sessionFactory.getCurrentSession(); 
 StudentEntity student = (StudentEntity)session.get(StudentEntity.class, 1); 
 //StudentEntity student_load = (StudentEntity)session.load(StudentEntity.class,1); String name = student.getName(); 
} 

先测试get方法,我们发现一旦我们只是拿student这个实体操作,get方法是会输出相关的sql查询语句的,而我们注释掉get方法,换load方法的话,load方法执行拿student这个实体的数据是没有输出相应的sql语句的。但是我们在对student类进行操作的时候,这时才输出相关的语句.

所以我们看出get()和load()之间的差别:

get()每次执行都会执行sql语句,不会延迟。load()方法只是会在我们对拿到的实体进行操作的时候才去执行查询,拿到相应的实体信息。load方法返回的是一个代理对象(马士兵老师视频)。无论是get还是load首先都会查一级缓存(session)中有没有相应的对应值,如果没有,再去数据库进行查找。

clear()方法是对session里面的缓存进行了清理,测试这个方法我们可以根据下面的Junit进行测试:

@Test 
 public void testClear() { 
  Session session = sessionFactory.getCurrentSession(); 
  session.get(StudentEntity.class,1); 
  session.clear(); 
  session.get(StudentEntity.class,1); 
 } 

如果我们把session.clear()注释掉的话,我们就可以看到只执行了一条sql语句

flush()方法是是对数据库同步的一条语句,执行完这个后立即刷新到数据库。粗浅的来看哈,其实里面还是有很多东西,比如FlushMode这个类,我们默认设置的是FlushMode.AUTO,这个一般不修改,只是为了以后的性能调优。其实我们在执行事务的时候,事务完成之后它会帮我们执行flush()方法。只是我们在进行大规模插入的时候,我们经常可以看到下面的操作:

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction();  
for ( int i=0; i<100000; i++ ) {  
Customer customer = new Customer(.....);  
session.save(customer);  
if ( i % 20 == 0 ) { 
//20, same as the JDBC batch size   
//flush a batch of inserts and release memory:   
session.flush();  
session.clear();  
}}  
tx.commit();session.close(); 

这样做的目的就是避免大量插入,造成session里面内存溢出,所以我们定时清理一下就可以避免这个问题。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# hibernate  # session  # Hibernate的Session_flush与隔离级别代码详解  # Hibernate中Session增删改查操作代码详解  # Hibernate中获取Session的两种方式代码示例  # hibernate通过session实现增删改查操作实例解析  # 快速了解Hibernate中的Session  # 简介Java的Hibernate框架中的Session和持久化类  # Hibernate管理Session和批量操作分析  # hibernate关于session的关闭实例解析  # 的是  # 可以根据  # 就可以  # 进行测试  # 都是  # 好了  # 就像  # 死记硬背  # 有很多  # 那么多  # 中有  # 给我们  # 会在  # 这个问题  # 要在  # 要注意  # 要想  # 这样做  # 如果没有  # 可以看到 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何选择PHP开源工具快速搭建网站?  如何基于PHP生成高效IDC网络公司建站源码?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  免费网站制作appp,免费制作app哪个平台好?  网站制作壁纸教程视频,电脑壁纸网站?  如何用搬瓦工VPS快速搭建个人网站?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  如何获取PHP WAP自助建站系统源码?  大型企业网站制作流程,做网站需要注册公司吗?  动图在线制作网站有哪些,滑动动图图集怎么做?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel如何实现文件上传和存储?(本地与S3配置)  独立制作一个网站多少钱,建立网站需要花多少钱?  网站建设整体流程解析,建站其实很容易!  Android使用GridView实现日历的简单功能  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  魔方云NAT建站如何实现端口转发?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  在线教育网站制作平台,山西立德教育官网?  LinuxShell函数封装方法_脚本复用设计思路【教程】  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  微信小程序 require机制详解及实例代码  利用 Google AI 进行 YouTube 视频 SEO 描述优化  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  JavaScript如何实现错误处理_try...catch如何捕获异常?  如何用PHP快速搭建CMS系统?  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  如何在阿里云虚拟主机上快速搭建个人网站?  如何基于云服务器快速搭建个人网站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  C++时间戳转换成日期时间的步骤和示例代码  微信公众帐号开发教程之图文消息全攻略  Laravel如何使用Telescope进行调试?(安装和使用教程)  Python图片处理进阶教程_Pillow滤镜与图像增强  如何用低价快速搭建高质量网站?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Laravel如何实现事件和监听器?(Event & Listener实战)  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何在IIS服务器上快速部署高效网站?  无锡营销型网站制作公司,无锡网选车牌流程?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel如何发送系统通知?(Notification渠道示例)