Hibernate持久化对象修改id重新保存的办法
Hibernate持久化对象修改id重新保存的办法——Hibernate学习记录二
昨天在工作中遇到一个特殊的场景,点击修改,对一条发布状态的记录进行复制,并生成一个草稿版本,也就是同一条记录的不同状态,也就出现需要从数据库get之后把id置空重新保存,这里出现一个问题,但Hibernate的持久化对象是无法对id进行修改操作的,需要重新new一个全新的对象存储才可以,但Java中的机制,如果采用new Object()并赋值的的方式并不是真的产生一个新的对象,而是引用赋值,即传递内存地址,学过C语言的很容易理解。
要实现这种需求,就要复制出一个全新的对象,Java提供了一种解决办法——对象克隆。
对象克隆的方法:
实体类实现Cloneable接口,然后在实体类中重写clone()方法,以User类为例,如下所示:
- package com.domain;
 - /**
 - * Created by Jiro.Chen on 2017/11/6.
 - */
 - public class User implements Cloneable {
 - private String id;
 - private String name;
 - private Integer age;
 - private String address;
 - public String getId() {
 - return id;
 - }
 - public void setId(String id) {
 - this.id = id;
 - }
 - public String getName() {
 - return name;
 - }
 - public void setName(String name) {
 - this.name = name;
 - }
 - public Integer getAge() {
 - return age;
 - }
 - public void setAge(Integer age) {
 - this.age = age;
 - }
 - public String getAddress() {
 - return address;
 - }
 - public void setAddress(String address) {
 - this.address = address;
 - }
 - public boolean equals(Object o) {
 - if (this == o) return true;
 - if (o == null || getClass() != o.getClass()) return false;
 - User user = (User) o;
 - if (id != null ? !id.equals(user.id) : user.id != null) return false;
 - if (name != null ? !name.equals(user.name) : user.name != null) return false;
 - if (age != null ? !age.equals(user.age) : user.age != null) return false;
 - if (address != null ? !address.equals(user.address) : user.address != null) return false;
 - return true;
 - }
 - public int hashCode() {
 - int result = id != null ? id.hashCode() : 0;
 - result = 31 * result + (name != null ? name.hashCode() : 0);
 - result = 31 * result + (age != null ? age.hashCode() : 0);
 - result = 31 * result + (address != null ? address.hashCode() : 0);
 - return result;
 - }
 - @Override
 - public Object clone(){
 - User user = null;
 - try {
 - user = (User)super.clone();
 - }catch (CloneNotSupportedException e){
 - e.printStackTrace();
 - }
 - return user;
 - }
 - }
 
这样使用的时候,User user1 = new User(); User user2 = user1.clone();即可将user1的所有属性值复制给user2,但他们是两个对象,而不是同一个对象的引用。之后可以进行id的修改,然后用Hibernate进行保存,生成一条新的记录。
Hibernate持久化对象修改id重新保存的办法的更多相关文章
- hibernate 持久化对象的生命周期 2.1
		
持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...
 - hibernate 持久化对象的生命周期
		
持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...
 - hibernate 持久化对象 save
		
hibernate 持久化对象 save new出来的user对象是游离状态的对象,执行session.save()方法保存后,user对象就变为持久化了,持久化的对象跟数据库表双向绑定的意思, 对象 ...
 - 1.1Hibernate持久化类和Hibernate持久化对象状态
		
一.持久化对象po类 1.po定义 PO,是Persistent Object的缩写,是持久化类.PO是由PO=POJO+hbm映射配置组成. 2.通俗理解 PO类即持久化类,其实就是一个普通的Jav ...
 - Hibernate持久化对象状态
		
在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关. 各自是瞬时(Transient),持久太(persistent)和游离态(Detached) 瞬时状 ...
 - Hibernate持久化对象的三种状态深入理解
		
关于OID hibernate缓存是一个map,他会根据OID作为缓存对象的key,我们的映射文件中<id>标签指定的属性值会作为OID 持久化对象的三种状态 为了方便理解,Hiberna ...
 - Hibernate持久化对象的状态
		
1. 站在持久化的角度 , Hibernate 把对象分为 4 种状态 : 持久化状态, 暂时状态, 游离状态(脱管状态) , 删除状态.Session 的特定方法能使对象从一个状态转换到还有一个状态 ...
 - Hibernate持久化对象
		
持久化类应遵循的规则: 有无参构造器,构造器的修饰符>=默认访问控制符 有标识属性,映射数据库表的主键,建议使用基本类型的包装类 每个成员有setter和getter 非final修饰的类 重写 ...
 - hibernate 持久化对象的三个状态
		
Hibernate中的对象有3种状态 瞬时对象(TransientObjects).持久化对象(PersistentObjects)和离线对象(DetachedObjects也叫做脱管对象) Tran ...
 
随机推荐
- 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型
			
人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...
 - 《Node.js核心技术教程》学习笔记
			
<Node.js核心技术教程>TOC \o "1-3" \h \z \u 1.章模块化编程 2019.2.19 13:30' PAGEREF _101 \h 1 08D ...
 - 华为笔试——C++的int型数字位排序
			
题目:int型数字位排序 题目介绍:输入int 型整数,按照从右至左的顺序,返回不含重复数字的新整数. 例: 输入: 99824270 输出: 072489 分析:乍一看很简单,但是很容易忽略int ...
 - Cannot find class [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter]
			
<!--避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJacksonHttpMessageConverter" cl ...
 - 4.airflow测试
			
1.测试sqoop任务1.1 测试全量抽取1.1.1.直接执行命令1.1.2.以shell文件方式执行sqoop或hive任务1.2 测试增量抽取2.测试hive任务3.总结 当前生产上的任务主要分为 ...
 - Java线上应用故障排查之一:高CPU占用 (转)
			
一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. (友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hank ...
 - Scrum立会报告+燃尽图(十一月二十四日总第三十二次):视频剪辑
			
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
 - CS小分队第一阶段冲刺站立会议(5月14日)
			
昨日成果:为抽号计时器添加了第一类抽号,基本实现界面,功能出现了一些错误 遇到问题:我预想通过timer控件来实现随机抽号而拜托随机生成数,但是出现了只有个位随机滚动,其他位数不动的现象,我预计是数值 ...
 - 读我是一只IT小小鸟有感
			
进入大学半年了,每个人都说软件工程是一个非常有前途的高薪职业,但我这半年来都很迷茫,看不清自己的未来,不知道如何度过接下来的三年半时光,虽然我也认为软件工程是有前途的专业,但是经过一学期的学习,发现不 ...
 - erlang node time ticket
			
Erlang doesn't detect net splits by itself. You could start looking atnet_kernel:set_net_ticktime/2 ...