1.输入参数

一般而言,传递给update的对象要是处于游离状态的对象。如果传一个持久化对象,那么update方法就是多余的,因为Hibernate的脏检查机制会自动根据对象属性值的变化向数据库发送一条update语句;如果传入的对象处于临时状态,那么此时Hibernate应该会抛出异常。因为Hibernate在更新数据时会根据对象的OID去数据库查找相应的记录并更新之,而在数据库中是没有记录与这个临时对象相关联的,因此Hibernate会抛出异常,当然如果你人为的给临时对象指定一个OID就该另当别论了,如下所示代码片段:

Customer customer=new Customer();

customer.setId(3L);

customer.setName(“Cindyelf”);

session.update(customer);

这段代码会导致如下的sql:update Customer set name=’Cindyelf’ where  id=3;当然如果数据库不存在id为3的那行记录,Hibernate就会抛出异常。而给临时对象指定OID是不合规范的操作,应尽量避免。也就是说不管传入是什么状态对象,数据库中必须要有一条记录与这个对象的OID相对应,否则抛出异常。

2.操作

执行update方法的时候,Hibernate会首先把传入的对象放入Session的缓存中,使之持久化,然后计划执行一个update语句。Hibernate在生成sql语句的时候会根据对象的当前属性值来组装sql语句,也就是说,不管程序中修改了多少次属性值,在执行时只会执行一条update一句。

此外,在update的官方API中特意强调了一点,“如果在session的缓存中有一个持久化对象和所要更新的对象具有相同的OID,那么Hibernate会抛出异常”。下面的代码片段演示了这个错误:

Customer customer=new Customer();

session1.save(customer);

Customer customer1=(Customer)session.load(Customer.class,new Long(6))

session2.update(customer);

如上所示,我在session1中持久化了一个Customer对象,它的OID是6,然后我在session2中load一个OID为6的对象customer1,然后在session2中update之前的customer,注意,对于session2而已,customer1是处于游离状态的,因为它不处于session2的缓存中。此时程序会报如下错误:a different object with the same identifier value was already associated with the session。

转载于:https://www.cnblogs.com/anuoruibo/archive/2012/03/20/2407948.html

关于Session接口的update方法主要有如下几点要注意相关推荐

  1. Hibernate之Session merge与update方法

    2019独角兽企业重金招聘Python工程师标准>>> 项目中使用Hibernate时报了一个异常:org.hibernate.NonUniqueObjectException;经从 ...

  2. hibernate中session接口方法总结

    Session的save()和persist()方法 Session的save()方法使一个临时对象转变为持久化对象.它完成以下操作: (1)将临时对象加入到Session缓存中,使其进入持久化状态. ...

  3. Hibernate Session merge,update,save,saveOrUpdate,persist

    Hibernate Session merge,update,save,saveOrUpdate,persist Hibernate Session是java应用程序和hibernate框架之间的接口 ...

  4. SSH学习之Session接口的常用方法

    回忆 在上一篇播客SSH学习之Hibernate的第一个程序中介绍了基本的Hibernate框架的开发搭建环境,了解了Hibernate的基本过程.在这一篇里,我要介绍的是我么使用Hibernate框 ...

  5. hibernate中PO对象的三种状态分析以及session中的一些方法的区别

    hibernate的状态 hibernate的各种保存方式的区(save,persist,update,saveOrUpdte,merge,flush,lock)及 对象的三种状态 hibernate ...

  6. java hibernate更新_Hibernate更新某些字段的几种update方法

    Hibernate 中如果直接使用 Session.update(Object o); 会把这个表中的所有字段更新一遍. 比如: public class TeacherTest { @Test pu ...

  7. cookielifetime php_PHP session有效期session.gc_maxlifetime的设置方法

    PHP(外文名: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学 ...

  8. libed2k源码导读:(二)Session接口以及实现分析

    第二章 Session接口以及实现分析 目录 第二章 Session接口以及实现分析 2.1 获取会话状态 2.2 管理会话中所有的传输任务 2.3 管理点对点连接 2.4 管理alert 2.4.1 ...

  9. SpringBoot2整合Mybatis拦截器,拦截mapper接口的某个方法

    需求: 在执行某个动态sql时,where 子句,希望通过用户进行自定义查询条件,比如用户可以传入 "id > 100011 and name = '张三'" 的多条件表达式 ...

最新文章

  1. 计算机的英语怎么写的英语怎么写,计算机英语怎么写
  2. 程序员面临的伦理困境
  3. Django 入门项目案例开发(下)——创建项目应用及模型类
  4. CG CTF WEB 伪装者
  5. java中将string类型转int类型或者将string类型转long类型方法(亲测)
  6. PCM设备是做什么的? PCM作用是什么?
  7. 乾坤大挪移——冒泡法排序,良心之作,拒绝入坑
  8. NodeJs安装教程:看教程一步步学会安装NodeJs
  9. Zookeeper总结——知识点、选举机制、客户端操作及写数据流程、API操作、zookeeper分布式锁之 Curator、ZAB协议、CAP理论之zookeeper的CP理论
  10. 基于微信小程序的在线考试系统【毕业设计源码】
  11. android崩溃日志 2016,常用获取Android崩溃日志的几种方法
  12. 基于深度学习的单人步态识别系统
  13. Mysql数据表存在一对多数据合并
  14. Python进程池apply_async的callback函数不执行的解决方案
  15. jsPlumb流程图完整实例
  16. python获得股票数据并画图
  17. Redis 6.0 新特性-多线程连环 13 问!
  18. 如何获取维普免费账号--应对大家工作后在校外下载维普万方等全文
  19. 因果分析系列1--入门
  20. 避免重复造轮子,Java 程序员必备

热门文章

  1. java中ftp删除文件,Java 实现ftp 文件上传、下载和删除
  2. 记录 之 一个小bug:Unsupported syntax ‘Starred‘
  3. eclipse启动不了并报错Java was started but exit with code 13 问题解决
  4. 问题:c语言简单的循环和字符串,错在哪里了?结果怎么是0(已解决)
  5. mysql操作语句now_【MySQL数据库开发之二】MySQL 基础语句的书写与操作!
  6. c 语言中unsigned char类型变量占用内存大小,C数据类型
  7. 使用独立mysql_MYSQL建立独立数据库以及独立数据库用户详细教程,利用PHPstudy自带的MySQL-Front...
  8. visio数据流线文字方向的问题
  9. access violation at address in module Read of address
  10. spring中的controller种类