使用hibernate时遇到了一个查询对象中数据没有操作而改变的问题,后来发现是因为后面操作中又查询了这个对象进行了修改,因为引用地址一样,所以前面的数据也进行了改变。
因为之前编码时,误以为、
Foo foo1=new Foo();
Foo foo=foo1;
然后就想当然的认为副本foo1生成了!
其实foo1对象还是一个引用
使用的方法为
其实foo1对象还是一个引用
引入克隆
看了这么多方法都不行,还很麻烦!干脆用克隆吧,简单明了。
例子:
定义类CloneFooA。
/**
* 简单类克隆实现
* 要实现克隆,必须实现Cloneable接口,这是一个标识接口,没有接口方法
* 实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。
* 按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。
*/
public class CloneFooA
implements Cloneable {
private String strA;
private int intA;
public String getStrA() {
return strA;
}
public void setStrA(String strA) {
this.strA = strA;
}
public int getIntA() {
return intA;
}
public void setIntA(int intA) {
this.intA = intA;
}
/**
* @return 创建并返回此对象的一个副本。
* @throws CloneNotSupportedException
* @ 此处使用public为深度克隆,即对象中的对象引用地址也不同
* @ 此处使用public为深度克隆,即对象中的对象引用地址也不同
*/
public CloneFooA
clone() throws
CloneNotSupportedException{
//直接调用父类的clone()方法,返回克隆副本
return (CloneFooA)super.clone();
}
}
CloneFooA a=new CloneFooA();
CloneFooA b = a.clone();
这样 a和b的引用就不一样了;