Hibernate三个状态以及SaveOrUpdata的使用

反激系列-详细到每个容阻的原理之RCD吸收(1) 1、漏感尖峰电压会被RCD吸收,漏感能量一定,电容越大,电容充电的电压就越低,吸收能力就越强,MOS漏极的电压就越低。2、在漏感能力释放完之后(这个过程一般只有一个周期的3%时间),是要通过R1释放掉电容吸收的能量的,把电容的电压降下来方便下一次漏感尖峰来之前再进行吸收。3、电容容量和电阻需要合理搭配,容量足够即可,足够能吸收漏感尖峰电压,不至于超过MOS耐压。电阻需要足够小,小到在放电阶段把电容电压下降到MOS的电压平台。 阅读详情

参考:https://blog.youkuaiyun.com/daryl715/article/details/1756325

https://www.cnblogs.com/xiaoluo501395377/p/3380270.html

一、hibernate有哪三个对象

  1. 瞬时 (Transient )/临时状态/自由状态:

条件:1.不处于 Session 的缓存中,也可以说,不被任何一个 Session 实例关联。

            2.在数据库中没有对应的记录。

  1. 持久 (Persistent)

条件:1.处于Session的缓存中

      2.在数据库中有对应的记录

  1. 脱管 (Detached)

条件:1.不处于Session的缓存中

             2.数据库中有对应的记录

二、应用

  1. 当瞬时状态转为持久化状态的时候(save),hibernate会发出一条insert语句 -----表示数据库中原来并没有这个对
    session = HibernateUtil.openSession();
      session.beginTransaction();
     User user = new User();
     user.setUsername("aaa");
     user.setPassword("aaa");
     user.setBorn(new Date());
                /*
                 *  以上user就是一个Transient(瞬时状态),此时user并没有被session进行托管,即在session的
                 *  缓存中还不存在user这个对象,当执行完save方法后,此时user被session托管,并且数据库中存在了该对象
                 *  user就变成了一个Persistent(持久化对象)
                 */
     session.save(user);
     session.getTransaction().commit();
    ---------------------------------------------------------
    Hibernate: insert into t_user (born, password, username) values (?, ?, ?)
    

     

  2. 当对象处于持久化状态的时候,如果将对象的非主键属性进行修改,然后提交事务,那么hibernate出来会发送insert语句还有update语句
    session = HibernateUtil.openSession();
                session.beginTransaction();
                User user = new User();
                user.setUsername("aaa");
                user.setPassword("aaa");
                user.setBorn(new Date());
                //以上u就是Transient(瞬时状态),表示没有被session管理并且数据库中没有
                //执行save之后,被session所管理,而且,数据库中已经存在,此时就是Persistent状态
                session.save(user);
                //此时u是持久化状态,已经被session所管理,当在提交时,会把session中的对象和目前的对象进行比较
                //如果两个对象中的值不一致就会继续发出相应的sql语句
                user.setPassword("bbb");
                //此时会发出2条sql,一条用户做插入,一条用来做更新
                session.getTransaction().commit();
    
    ----------------------------------------------------------
    Hibernate: insert into t_user (born, password, username) values (?, ?, ?)
    Hibernate: update t_user set born=?, password=?, username=? where id=?
    

     

  3. 当对象是持久化对象的时候,对对象进行多次的save或者update等方法,hibernate暂时不发送sql语句。只有当事务提交的时候,才将session中的对象(也可认为是多次操作后的对象)和数据库中的进行对比,发出insert或者update语句。
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                session = HibernateUtil.openSession();
                session.beginTransaction();
                User u = new User();
                u.setBorn(new Date());
                u.setUsername("zhangsan");
                u.setPassword("zhangsan");
                session.save(u);
                u.setPassword("222");
                //该条语句没有意义
                session.save(u);
                u.setPassword("zhangsan111");
                //没有意义
                session.update(u);
                u.setBorn(sdf.parse("1988-12-22"));
                //没有意义
                session.update(u);
                session.getTransaction().commit();
    ----------------------------------------------------------------------------
    Hibernate: insert into t_user (born, password, username) values (?, ?, ?)
    Hibernate: update t_user set born=?, password=?, username=? where id=?
    

     

  4. 当session调用load、get方法时,此时如果数据库中有该对象,则该对象也变成了一个持久化对象,被session所托管(如果在提交事务前,使用了session.clear,继续事务提交的时候,hibernate不会发出update语句)
    session = HibernateUtil.openSession();
                session.beginTransaction();
                //此时u是Persistent
                User u = (User)session.load(User.class, 4);
                //由于u这个对象和session中的对象不一致,所以会发出sql完成更新
                u.setUsername("bbb");
                session.getTransaction().commit();
    -------------------------------------------------------------------------------------
    Hibernate: select user0_.id as id0_0_, user0_.born as born0_0_, user0_.password as password0_0_, user0_.username as username0_0_ from t_user user0_ where user0_.id=?
    Hibernate: update t_user set born=?, password=?, username=? where id=?
    

     

  5. 游离状态的对象,如果调用save方法,如果主键设置为自生成策略,那么hibernate会发送一个新 的insert语句。如果要将游离状态的对象转化为持久化对象,那么使用update方法,这时hibernate才会发送update语句。(不太确定),因此为了用错save或者是update方法,一般使用saveOrupdate()方法
    session = HibernateUtil.openSession();
                session.beginTransaction();
                //此时u是一个离线对象,没有被session托管
                User u = new User();
                u.setId(4);    (数据库中已经存在id为4的对象,此时为游离对象)
                u.setPassword("hahahaha");
                //当执行save的时候总是会添加一条数据,此时id就会根据Hibernate所定义的规则来生成
                session.save(u);
                session.getTransaction().commit();
    -----------------------------------------------------------------
    Hibernate: insert into t_user (born, password, username) values (?, ?, ?)
    

三、SaveOrUpdate和unsaved-value的关系(重点理解)

unsaved-value可以是下列几个选项:

1)null:主键是对象类型(String/Integer/Long),Hibernate判断操作对象的主键是否为null,来判断操作对象是否以被持久化,如果是,调用save方法,生成insert语句,在数据库中增加一条记录,如果不是,设置主键则直接生成update的SQL语句,发送update,如果数据库中没有那条记录则抛出异常。

2)none:由于不论主键属性为任何值,都不可能为none,因此Hibernate总是对被操作对象发送update。

3)any:由于不论主键属性为任何值,都肯定为any,因此Hibernate总是对被操作对象发送save,Hibernate生成主键。

     当数据库进行save操作以后,数据库会返回一个id给被操作的对象

四、可能遇到错误

  1. 如果试图修改一个持久化对象的主键的值(该主键有自动生成策略,比如ID)的话,就会抛出异常(非主键不会报错)
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                session = HibernateUtil.openSession();
                session.beginTransaction();
                User u = new User();
                u.setId(5);
                //完成update之后也会变成持久化状态
                session.update(u);
                u.setBorn(sdf.parse("1998-12-22"));
                u.setPassword("lisi");
                u.setUsername("lisi");
                //会抛出异常
                u.setId(333);
                session.getTransaction().commit();
    --------------------------------------------------------------------------------
    org.hibernate.HibernateException: identifier of an instance of com.xiaoluo.bean.User was altered from 5 to 333
    

     

  2. session中保存两个相同的持久化对象,提交事务的时候报错(用merge解决)
    session = HibernateUtil.openSession();
                session.beginTransaction();
                //u1已经是持久化状态
                User u1 = (User)session.load(User.class, 3);
                System.out.println(u1.getUsername());
                //u2是离线状态
                User u2 = new User();
                u2.setId(3);
                u2.setPassword("123456789");
                //此时u2将会变成持
    久化状态,在session的缓存中就存在了两份同样的对象,在session中不能存在两份拷贝,否则会抛出异常
    ----------------------------------------------------------------------------
                session.saveOrUpdate(u2);
    org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.xiaoluo.bean.User#3]
    

    五、事务相关知识

  1. Hibernate事务存在是为了在遇到执行错误的时候可以进行回滚(系统突然崩或者其他情况),确保了事务的安全。.
  2. 在一个session中,持久化对象的变化,不需要调用update等显式语句,由flush方法就可以实现数据库表的更新。
  3. 对于集成了hibernate和Spring的框架,大多数情况下Spring都将hibernate的事务设置为自动提交,一般一个service方法调用一个session

<property name="hibernate.connection.autocommit">true</property>

      4.flush方法的主要作用就是清理缓存,强制数据库与Hibernate缓存同步,以保证数据的一致性。它的主要动作就是向数据    库发送一系列的sql语句,并执行这些sql语句,但是不会向数据库提交。而commit方法则会首先调用flush方法,然后提交事务。

六、扩展

(问题1,级联保存的时候) Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

(级联的时候,子对象并没有明显是使用save或者是update方法,父对象有,所以子对象要配置)

不是网上各种说法,而是当选择 assigned 生成器时,除非有一个 version 或 timestamp 属性,或者你定义了 Interceptor.isUnsaved(),否则需要让 Hiberante 使用 unsaved-value="undefined",强制Hibernatet 查询数据库来确定一个实例是瞬时的(transient) 还是脱管的(detached)。

https://blog.youkuaiyun.com/tianlincao/article/details/6040118

(问题2)当我们只更新部分字段的时候,如果使用update语句的话,由于hibernate发送的update语句更新的是全部属性字段,如果此时session中没有缓存其他字段,那么其他字段将会使用默认值更新到数据库中,因此会造成原有数据的丢失,于是我们要在配置文件中,将dynamic-update(动态更新)配置为true(默认为false)。配置以后,调用update语句以后,只更新修改部分,其他属性保持原样

参考:https://blog.youkuaiyun.com/daryl715/article/details/1756325

https://www.cnblogs.com/xiaoluo501395377/p/3380270.html

mabl:AI原生测试自动化平台的基础使用 mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。 阅读详情

相关推荐

车载导航GPS欺骗

因此,如果我们能够模拟卫星信号,将模拟的信号通过信号发射装置发送给GPS传感器,那么就有可能实现欺骗GPS传感器获取虚假的位置信息,这种技术即SDR(软件无线电,Software Defined Radio)[2]。究其原因,在不使用时钟模块的条件下,HackRF发送信号的频率可能不十分精准,因此GPS传感器接收到信号之后可能无法正常解析GPS信号,因此时钟信号可能是HackRF进行GPS欺骗的关键。2)HackRF是否使用了时钟模块,时钟模块决定了信号发送频率的精准程度,对实验的成败也是至关重要的。

2503_90751789的博客 1324

hibernate中的saveOrUpdate方法

saveOrUpdate方法是分为save(insert)和update(update)方法,它是根据session中对象的状态来判断并选择执行操作的。下面简述hibernate中对象的三种状态。 瞬时态(Transient,临时态):(对象未被持久化)实例对象是通过new关键字来开辟内存空间创建java对象,但是它并没有纳入hibernate的session管理中,如果没有变量对它引用,它将被

日拱一卒 5134

DSP28335学习笔记——McBSP配置为SPI

由于28335硬件外设上只有一个SPI接口,所以当SPI接口不够用时,可以将McBSP配置为SPI接口。 参考28335的数据手册,当DSP为主机时,配置McBSP为SPI所用到的接线如下图所示。 另外总结一些调试过程中的经验。 1.传输数据位数的确定 由RCR1寄存器中的RWDLEN1和XCR1寄存器中的XWDLEN1决定。分别对应着接受和发送的位数,在配置成SPI模式的时候,这

捕虫少年 1万+

Hibernate之saveOrUpdate

一个PO有三种状态: 1、未被持久化的VO 此时就是一个内存对象VO,由JVM管理生命周期 2、已被持久化的PO,并且在Session生命周期内 此时映射数据库数据,由数据库管理生命周期 3、曾被持久化过,但现在和Session已经detached了,以VO的身份在运行 这种和Session已经detached的PO还能够进入另一个Session,继续进行PO状态管理,此时它就成为PO

HuangQinJian 754

高德地图 搜索和点击定位

高德地图vue

weixin_45474673的博客 1942

LeRobot SO-ARM100 学习笔记(2) diffusion module

对 lerobot 中的 diffusion policy 进行基本的代码阅读

mikhailbran的博客 1586

Hibernate源码节选(二)save、update与saveOrUpdate

本文基于Hibernate 5.2 Session的save、update、saveOrUpdate Session#save 熟悉的操作:创建一个事件,找出对save事件感兴趣的监听器,把事件交给它们 public Serializable save(String entityName, Object object) throws HibernateException { retu...

无意中流逝的博客 1006

Tlsr8258开发-程序烧写

开源一小步,进步一大步

自学嵌入式 1773

Hibernate 的saveOrUpdate方法

hibernate提供了saveOrUpdate的方法来进行数据库的操作。hibernate会根据对象的状态决定是insert还是update,其根本是通过xml文件中unsaved-value来确定的。如果设置null,系统会根据传入的对象的id的值判断,如果是null,则表示对象不存在,那么insert;如果不是Null,则表示已经存在,那么update.如果设置为none,那么表示对象不存在

在JAVA的世界中“乘风破浪” 2万+

C#上位机与MES系统数据对接:从协议选型到安全传输的实战解析

本文详细解析了C#上位机与MES系统数据对接的全过程,从协议选型到安全传输的实战技巧。针对工业互联网场景下的数据对接挑战,提供了RESTful API、MQTT和OPC UA等协议的选型建议,并分享了健壮性设计、异常处理和安全传输的实用代码示例,帮助开发者高效实现数据上传与系统集成。

weixin_30566063的博客 105

【从零到一】Jetson Nano上YOLOv5部署完全攻略:零基础小白也能玩转边缘AI推理

文章摘要: 本文详细介绍了在Jetson Nano边缘设备上部署YOLOv5目标检测模型的完整流程。从硬件准备、系统镜像烧录、基础环境配置,到CUDA/cuDNN验证、Python虚拟环境搭建及PyTorch安装,逐步指导开发者完成部署准备。教程兼顾理论原理与实践操作,提供Python和C++两种实现方案,并涵盖TensorRT优化、实时检测等生产级应用场景,帮助零基础开发者快速掌握边缘AI推理技术,实现高性能目标检测应用。

LXY_LOVE36的博客 367

Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用

Hibernate的对象有3种状态,分别为:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。 瞬时态         由new命令开辟内存空间的java对象,        eg. Person person = new Per...

thurchin 158

智慧园区——解读零碳智慧园区全域双碳管理建设方案【附全文阅读】

《零碳智慧园区全域双碳管理建设方案》为园区开发运营企业、政府部门及绿色能源服务商等提供系统性指导。方案基于"背景-理念-路径"框架,首先分析全球双碳趋势及我国园区高碳排放现状,明确零碳园区价值;其次提出"数字+绿色"双动力理念,构建数字底座与绿色能源体系;最后详细规划实施路径,包括碳排查、绿能规划、能效优化、碳交易等全流程管理,结合数字孪生技术实现可视化管控,助力园区实现碳中和目标。

cdfunlove的博客 206

Hibernate的SaveOrUpdate方法

Hibernate中Session的saveOrUpdate方法是用来判断被操作对象究竟是一个持久化对象(persistent)还是自由状态(transient)对象,然后根据判断结果执行save或者update。 判断时参考对象映射文件的主键id中定义unsaved-value属性,如果不定义,则默认为unsaved-value=null。 unsaved-value有下列几个选项: 1.nu...

写代码有点意思哦 515

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

mysql saveorupdate_saveOrUpdate为什么不能智能处理???

首先,数据库表是空的,在程序里调用saveOrUpdate方法,产生的sql语句却是 update user set user_name=?, real_name=?, password=?, sex=?, birthday=?, email=?, address=?, telephone=?, qq=?, authority=?, remarks=?where user_id=?这样当然会出错,...

weixin_42139252的博客 530

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

MySQL保存或更新 saveOrUpdate

在项目开发过程中,有一些数据在写入时候,若已经存在,则覆盖即可。这样可以防止多次重复写入唯一键冲突报错。

liuxigiant的专栏 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数据库中的saveOrUpdate操作

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33935777的博客 547

hibernate的saveOrUpdate

主键是否为null,如果为null,那么新增,否则更新。主键为空字符串会执行更新而不是新增。

苍穹尘的博客 1695

update和saveOrUpdate详解 作者:robbin

update和saveOrUpdate详解作者:robbin (MSN:robbin_fan AT hotmail DOT com)在Hibernate中,最核心的概念就是对PO的状态管理。一个PO有三种状态:1、未被持久化的VO此时就是一个内存对象VO,由JVM管理生命周期2、已被持久化的PO,并且在Session生命周期内此时映射数据库数据,由数据库管理生命周期3、曾被

ewolf的工作专栏 2106

hibernate的saveOrUpdate方法

saveOrUpdate()方法到底怎么执行的?(原来和主键生成方式还有关系) 答: 该方法在执行过程中,需要一个对象作为参数。 如果主键生成方式为 手动设置:assigned: 1)如果该对象存在 标识属性 ,(通俗点就是对应数据库中主键列的属性,如student的id属性,class的id属性,各种类的id属性):  执行select * from table_n

qq_34468883的博客 2033

userhome hibernate session saveorupdate 与事务的关系

package jiajiao.qiantai; // Generated 2018-5-16 11:51:31 by Hibernate Tools 3.5.0.Final import java.util.List; import javax.naming.Context; import javax.naming.InitialContext; import org.apache.comm...

immense的博客 3426

java hibernate更新_hibernate的saveOrUpdate()方法

hibernate的saveOrUpdate()方法在WEB页面中得到一个对象有两种方法:(1)从Session中取得对象,然后关闭Session,该对象便成为了脱管对象;(2)直接new一个对象实例,它是临时对象.然而对于上述的两种情况,有不同的处理方法,对于第一种情况/*从Session中取Team对象*/Team team = TeamDAO.getTeamById("2456721df4f...

weixin_42373893的博客 694

hibernate 中的 update()和 saveOrUpdate()的区别,session 的 load()和 get()的区别

在 Hibernate 中,update()和以及load()和get()是一些常用的持久化操作方法,它们之间有一些重要的区别。update()

weixin_45422672的博客 418

浅谈hibernate save ,update 和 saveOrUpdate的区别

最近由于工作的需要使用批量插入数据,如果使用SQL语句构造,有两种方式:1、一个一个执行,2、构造很长的SQL语句然后一次性执行 先来说一下这种方式的缺点:1、构造SQL语句麻烦,容易出现问题,如果表字段过多,SQL语句很长,2、无论是一次性还是多长执行都会花费很长的时间 建议:如果使用这种方式最好不要使用String 构造SQL语句,在可控范围内可以这样使用,如果数据量很大,最好不要这样做。

5354

区分 Hibernate 会话中的 save() 和 saveOrUpdate() 方法

区分 Hibernate 会话中的 save() 和 saveOrUpdate() 方法

weixin_45428910的博客 507

Hibernate对象的三种状态、saveOrUpdate()方法及merge()方法的总结

瞬时状态(Transient) 对象与session没有关联,数据库中没有对应的数据。 一般new出来的对象便是瞬时对象。 对瞬时对象使用save()方法便使之成为持久对象。 由于数据库中没有对应的数据,所以对瞬时对象使用update()方法无效。 持久状态(Persistent) 对象与session有关联,且数据库中有对应id的数据。 使用get()、load()等方法获得的是持...

lwfung 1483
上一篇: 中文编码
下一篇: Spring的管理下,Hibernate 保存对象异常只能在Action层被捕获
FD-Do
博客等级 码龄10年 20粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值