Hibernate持久化对象修改id重新保存的办法
Hibernate持久化对象修改id重新保存的办法——Hibernate学习记录二
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/womeng2009/article/details/78502912
昨天在工作中遇到一个特殊的场景,点击修改,对一条发布状态的记录进行复制,并生成一个草稿版本,也就是同一条记录的不同状态,也就出现需要从数据库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;
-
}
-
-
-
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进行保存,生成一条新的记录。