我的见解之hibernate(五)

《Hibernate学习笔记五》Session 的update方法详解 《Hibernate学习笔记五》Session 的update方法详解在前面的学习中,我们用到了Session的save方法,将对象从tansient状态转化为persistent状态。下面我们就来学习Session的update方法。在hibernate api文档中,Session接口提供了两种重载了update方法,分别如下:1、void update(Object object) :Upd 阅读详情

Session的方法

save():使一个临时对象转变为持久化对象,先放入session缓存中,在flush的时候执行一条insert语句,插入数据库。如果在指定了OID的生成方式时,new出对象并尝试给id赋值,也没用,数据库本地依旧采用给定的方式生成主键

<span style="font-size:24px;">	News news = new News("JAVA","guo",new Date());
		news.setId(50000);
		session.save(news);</span>
即使给news的id赋值,数据库本地依旧采用本地的方式自己赋值,oracle是序列

persist():是一个临时状态对象转化为持久化对象,这点与save()方法相同,但是呢,如果尝试为临时对象id赋值,persist方法会报异常,而save方法不汇报异常,继续执行

注意:hibernate持久化对象通过OID与数据库保持联系,所以我们不能尝试为一个持久化状态对象更改OID。

<span style="font-size:24px;">@Test
	public void testUpdate2(){
		News news = (News)session.get(News.class, 150);
		news.setId(10000);
		session.update(news);
	}</span>
<span style="font-size:24px;">@Test
	public void testPersist(){
		News news = new News("JAVA","guoasdad",new Date());
		news.setId(10000);
		System.out.println(news);
	}
这里输出是News [id=10000, title=JAVA, author=guoasdad, date=Wed Aug 24 11:17:19 CST 2016]</span><span style="font-size:24px;">
</span>
id虽然被我们更改了,但是我们仅仅只是为了输出它,数据库以及session缓存中的这个对象的OID我们不能修改


get()和load():都可以根据跟定的 OID 从数据库中加载一个持久化对象

区别:
①当数据库中不存在与 OID 对应的记录时, load() 方法抛出 ObjectNotFoundException 异常, 而 get() 方法返回 null
②两者采用不同的延迟检索策略:load 方法支持延迟加载策略。而 get 不支持。

<span style="font-size:24px;">@Test
	public void testLoad2(){
		News news = (News)session.load(News.class,150);
		session.close();
		System.out.println(news);
	}
LazyInitializationException: could not initialize proxy - no Session 懒加载异常
</span>

get方法是直接查询对象,即使session关闭也没有关系,我依然可以使用这个对象

load方法是延迟加载,所谓延迟加载的意思呢就是,我去查询对象,返回的却是这个对象的代理对象,如果我需要使用这个对象的时候,我再去加载对象的内容,而我们把session关闭了,相当于把路封死了,我们就没办法获得这个对象的属性,就会报异常

立即加载和延迟加载各有好处,如果对于集合类对象的话,我们更希望延迟加载,这样在我使用的时候再去真正加载,节省内存,减少资源的浪费,而立即加载不会出现懒加载异常


update():

①使一个游离对象转变为持久化对象,先放入session缓存中,在flush的时候执行一条update语句,更新数据库。

②若希望 Session 仅当修改了 News 对象的属性时, 才执行 update() 语句, 可以把映射文件中 <class> 元素的 select-before-update 设为 true. 该属性的默认值为 false

③当 update() 方法关联一个游离对象时, 如果在 Session 的缓存中已经存在相同 OID 的持久化对象, 会抛出异常

<span style="font-size:24px;">@Test
	public void testUpdate(){
		News news = (News)session.get(News.class,149);
		session.close();
		session = sessionFactory.openSession();
		transaction = session.beginTransaction();
		News news2 = (News)session.get(News.class,149);
		news.setAuthor("00000");
		session.update(news);
	}</span>
上面的代码是,我先从数据库中查OID是149的一个对象,然后我把session关闭,他变成了一个游离对象,另外开启一个session和事务,我们在这个心session中获得一个OID为149的对象,然后我们尝试将第一个session获取的149的游离对象通过update转化为持久化对象,就会报异常 org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.jiangtao.hibernate.test.News#149]

④当 update() 方法关联一个游离对象时, 如果在数据库中不存在相应的记录, 也会抛出异常.

saveOrUpdate():先判断对象是游离对象还是临时对象

①Session 的 saveOrUpdate() 方法同时包含了 save() 与 update() 方法的功能

②判定对象为临时对象的标准
    Java 对象的 OID 为 null
    映射文件中为 <id> 设置了 unsaved-value  属性, 并且 Java 对象的 OID 取值与这个 unsaved-value 属性值匹配

<span style="font-size:24px;">	@Test
	public void testSaveOrUpdate(){
		News news = new News("FFFfa", "fff", new Date());
		//news.setId(14);  //采用数据库本地的方式设置OID,自己不允许设置,除了save方法,其他会报错
		session.saveOrUpdate(news); 
	} 发送insert语句
        
      @Test
	public void testSaveOrUpdate2(){
		News news = (News) session.get(News.class, 149);
		news.setAuthor("jiangtao");
		//news.setId(5555);   //不允许更改OID
		session.saveOrUpdate(news); 
	}发送update语句</span>

merge:上一个图


delete():

①Session 的 delete() 方法既可以删除一个游离对象, 也可以删除一个持久化对象
②Session 的 delete() 方法处理过程
    计划执行一条 delete 语句
     把对象从 Session 缓存中删除, 该对象进入删除状态.在flush或者commit的时候删除
    Hibernate 的 cfg.xml 配置文件中有一个 hibernate.use_identifier_rollback 属性, 其默认值为 false, 若把它设为 true, 将改变 delete() 方法的运行行为: delete() 方法会把持久化对象或游离对象的 OID 设置为 null, 使它们变为临时对象



Hibernate+IDEA 2018 一个hibernate程序 Hibernate+IDEA 2018 一个hibernate程序 ※Windows 10 OS version 1703 ※IDEA 2018 ※JDK 1.8 ※MySQL:5.7 ※Hibernate:5.2.11 立即下载

相关推荐

Arduino应用——PWM控制直流电机风扇

Arduino应用——PWM控制直流电机风扇PWM原理实验器件功能描述如何改变文本的样式插入链接与图片实现代码生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 最近在使用arduino UNO开发板完成课程小作业。其中一个要求设计一个电风扇控制系统,要求能够通过PWM调节风扇的转速。期间搜索了许多例程和方法,但受限于器件,效果不

hypecycle的博客 2万+

Hibernate的HQL和Hive的HQL

Hibernate的HQL和Hive的HQL竟然是两家人!

qq_43488791的博客 807

51单片机IAP技术详解:从原理到实战,实现远程程序自更新

在嵌入式系统开发中,程序更新是产品维护和功能迭代的核心需求。传统方式依赖外部烧录器,操作繁琐且无法远程进行。IAP(在应用中编程)技术则从原理层面解决了这一难题,它允许单片机在运行过程中通过特定接口(如串口)动态修改自身的Flash程序存储器。这项技术的核心价值在于赋予设备远程升级和自主维护的能力,极大地延长了产品生命周期并降低了维护成本。其典型应用场景包括智能家居控制器、工业数据采集模块和远程仪表等部署后不便拆卸的设备。本文以经典的51单片机(如STC89C52)为例,深入剖析IAP的实现,其中Bootl

weixin_29161719的博客 407

hive的介绍与使用

hive产生的意义 使用SQL来操作Hadoop,从而简化代码更容易操作 Hive:一个基于Hadoop之上的中间件 简单来说就是: 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类 SQL 查询功能,本质是将 SQL 转换为 MapReduce 程序,主要用途是用来做离线数据分析,比直接用 MapReduce 开发效率更高。 为什么使用 Hive ? ...

weixin_44067108的博客 635

从零开始:DJI-F450无人机硬件组装全流程解析

本文详细解析了DJI-F450无人机的硬件组装全流程,从开箱清点到焊接、机械组装、飞控系统搭建、电路整合及调试试飞。重点介绍了电调焊接、机臂安装、飞控校准等关键步骤的实用技巧和常见问题解决方案,帮助无人机爱好者从零开始完成专业级组装。

weixin_29210759的博客 625

宝塔部署若依前端出现502解决方法

若依系统是一个基于Java语言的开源项目,旨在帮助开发者减少开发时间,特别适用于需要快速开发出一套具有用户管理、菜单管理、权限管理、定时任务、日志管理等功能的简单系统。系统分为前后端分离、分布式等架构前后端分离部署教程然而通过宝塔来部署若依系统会遇见一些问题,特此在这里记录一下。

m0_74823683的博客 776

Hive学习(二)基础知识

目录1、Hive 基本概念1.1、Hive 简介 1.1.1、什么是 Hive1.1.2、为什么使用 Hive1.1.3、Hive 特点1.2、Hive 和 RDBMS 的对比1.3、Hive 架构1.4、Hive 的数据存储 1、Hive 基本概念1.1、Hive 简介1.1.1、什么是 HiveHive 由 Facebook 实现并开源,是基于 Hadoop 的一个数据仓库工具,可以将结构化的...

potter 1164

用yolov8训练自己的模型并调取摄像头实时检测,新手小白超友好教程!逻辑梳理,从0开始逐步实操❤

帮新手小白学会用yolov8,包含多篇高质量博客整理

Lhhhhds的博客 2941

Hibernate支持哪些技术和数据库?

Hibernate 简介 简介 Hibernate 是由 Gavin King 于 2001 年创建的开放源代码的对象关系框架。它强大且高效的构建具有关系对象持久性和查询服务的 Java 应用程序。 Hibernate 将 Java 类映射到数据库表中,从 Java 数据类型中映射到 SQL 数据类型中,并把开发人员从 95% 的公共数据持续性编程工作中解放出来。 Hibernate 是传统 Ja...

qq_36760873的博客 1553

基于BP神经网络PID控制的电机转速控制器设计复现

摘要:本文提出了一种基于BP神经网络PID控制的永磁同步电机转速控制方法,通过MATLAB/Simulink平台实现了算法复现。系统采用三层BP神经网络在线调整PID参数,包含输入层(误差、误差变化率、误差积分)、5节点隐含层和输出层(Kp、Ki、Kd)。仿真结果表明,相比传统PID控制,该方案具有更快的响应速度(上升时间减少约40%)、更小的超调量(降低约60%)和更强的抗干扰能力,在电动汽车电机驱动等复杂工况下表现优异。文中详细给出了PMSM数学模型建立、BP网络设计、权值更新算法及Simulink仿真

max500600的博客 308

《UDS协议从入门到精通(UDS速查手册)》(完结撒花版)

专栏总目录,文中介绍了UDS协议相关的基础知识和一些术语,给出了详细介绍6大类26种服务的跳转目录。

车载系统攻城狮 9万+

我的见解之hibernate(八)

内容:详解*.hbm.xml关系映射配置文件 hibernate-mapping     类层次:class     主键:id     基本类型:property     实体引用类: many-to-one  |  one-to-one     集合:set | list | map | array     one-to-many     many-to-many     子

Java_Soldier的博客 7752

从零开始:C#上位机集成YOLO完成摄像头目标追踪(保姆级教程)

新手入门C#上位机+YOLO做摄像头目标追踪,最忌讳的是“只抄代码,不懂逻辑”。这个教程不仅给了完整代码,还把核心原理和踩坑点都讲清楚了,新手跟着走,不仅能跑通demo,还能理解为什么这么写。如果你们在运行时遇到具体问题,比如模型导出失败、代码报错,都可以在评论区留言,我会一一解答。后续也可以出一期工业相机+YOLO目标追踪的教程,帮助大家把demo落地到实际生产中。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1031

关于hibernate的见解

Hibernate:     什么是hibernate:         Hibernate它是一个轻量级的jdbc封装,也就是说,我们可以使用hibernate来完成原来我们使用jdbc完成操作,就是与数据库的交互操作。它是在dao层去使用的。         对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping)   

github_39191620的博客 523

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

我的见解之hibernate(七)

hibernate.cfg.xml的一些配置        10 5 2 2000 2000 10 100 30 hibernate.jdbc

Java_Soldier的博客 7817

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

我的见解之hibernate(九)

Hibernate 把持久化类的属性分为两种: 值(value)类型: 没有 OID, 不能被单独持久化, 生命周期依赖于所属的持久化类的对象的生命周期 实体(entity)类型: 有 OID, 可以被单独持久化, 有独立的生命周期 显然无法直接用 property 映射 pay 属性 Hibernate 使用 元素来映射组成关系, 该元素表名 pay 属性是 Worker 类一个

Java_Soldier的博客 7529

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

我的见解之hibernate(十三)

HQL检索方式 HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似. 在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方式. 它有如下功能: 在查询语句中设定各种查询条件 支持投影查询, 即仅检索出对象的部分属性 支持分页查询 支持连接查询 支持分组查询, 允许使用 HAVING 和 GROUP

Java_Soldier的博客 7695

我的见解之hibernate(三)

通过Session操纵对象 Session 接口是 Hibernate 向应用程序提供的操纵数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载 Java 对象的方法. Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录对应. Session 能够在某些时间点, 按照缓存中对象的变化来执行相关的 SQL 语句, 来同步更新数据库, 这一过程被称

Java_Soldier的博客 3033

Hibernate简单得见解

Hibernate.cfg.xml  连接数据库用的  设置数据库方言(dialect)  设置数据库驱动  可设置展示sql以日志形式展示(show_sql) 并且格式化输出sql(format_sql)  更直观可读性高   设置会话的管理方式(和线程进行绑定)指定当前session范围和上下文由谁来跟踪管理   Hibernate中的实体类我觉得很有必要实现Serializable接口 ...

Mr_ZhangAdd的博客 319

我的见解之hibernate(六)

通过 Hibernate 调用存储过程 Work 接口: 直接通过 JDBC API 来访问数据库的操作 Session 的 doWork(Work) 方法用于执行 Work 对象指定的操作, 即调用 Work 对象的 execute() 方法. Session 会把当前使用的数据库连接传递给 execute() 方法.

Java_Soldier的博客 7616

json+hibernate死循环问题的一点见解

Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on net.sf.json.JSONException: There is a cycle in the hierarch

lkl713的专栏 6194

我的见解之hibernate(四)

站在持久化的角度, Hibernate 把对象分为 4 种状态: 持久化状态, 临时状态, 游离状态, 删除状态. Session 的特定方法能使对象从一个状态转换到另一个状态. 临时对象(Transient): 就是我们new的就是临时状态,他还没有OID 在使用代理主键的情况下, OID 通常为 null 不处于 Session 的缓存中 在数据库中没有对应的记录

Java_Soldier的博客 7631

hibernate学习之五——使用myeclipse部署及hibernate一些常见配置

一,myeclipse部署hhibernate开发环境 1, 1,右击项目,添加hibernate 2,选择版本,next 3,next,自动创建HibernateSessionFactory类 如果出现以下错误: 解决方法,更改java版本1.5或更高 4,next,添加数据库信息 5,next,直到完成。 pac

AC_coding 2286

关于hibernate的一点见解

用了hibernate开发项目已经很久了,尤其是delete(Object obj)方法,我个人一直认为delete只能删除persist状态的对象,正如api所说:voiddelete(Object object)           Remove a persistent instance from the datastore.不过今天我无意之中,使

zcl198715的专栏 508

我的见解之hibernate(十)

映射双向n-1关系: 举个简单的例子,顾客和订单的关系,一个顾客可以拥有多个订单,而多个订单可以同时属于一个顾客,这就是双向n-1关系, 在Customer一端,需要持有装载着Order集合的引用 /* * 1. 声明集合类型时, 需使用接口类型, 因为 hibernate 在获取 * 集合类型时, 返回的是 Hibernate 内置的集合类型, 而不是 JavaSE 一个标准的

Java_Soldier的博客 7481
上一篇: 我的见解之hibernate(四)
下一篇: 我的见解之hibernate(六)
Java_Soldier
博客等级 码龄10年 27粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值