HibernateException異常:identifier of an instance of bean was altered from 1 to 1(持久化對象ID變更)

原文地址:http://blog.csdn.net/yaerfeng/article/details/7387871

今天算是遇到一個問題了。相當苦惱。

需求如下:有2個相同id的對象,但它們的值不同。其中一個對象要用到另一個對象的屬性值。

由於在hibernate的sessionFactory().getSession中不能存在2個相同id的對象。故此,想出複製對象。

找了很多地方,發現有2種方法可以達到複製對象的目的,只是最後這種方法還是沒有解決我的問題。僅此記下來吧。

1,克隆clone

java支持克隆一個對象的值到另一個對象,簡單的克隆和深度克隆,深度克隆可能包括繼承,嵌套,沒有用到,所以也就沒怎麼去研究它。

首先,克隆的對象需要實現 Cloneable接口,重寫其中的clone()方法,爲了使clone()方法在外部可用,需要將重寫的方法訪問修飾符改成public級別。

  1. @Override  
  2.     public Object clone() throws CloneNotSupportedException {  
  3.         return super.clone();  
  4.     }  
@Override
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}

  1. dv=(Deliverymanreport)deliverymanreport.clone();//克隆對象  
dv=(Deliverymanreport)deliverymanreport.clone();//克隆對象

dv是deliverymanreport克隆的一個對象。它擁用克隆後的屬性和方法。


2,序列化和反序列化Serializable

序列化的對象要實現Serializable接口才能實現序列化。

序列化後,通過反序列化可以得到和當前對象一樣的對象。它比克隆來得更準備。但也就不一定最好,如果這個對象在之前被修改,序列化後可能就會出問題了。

  1. ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  
  2. ObjectOutputStream out= new ObjectOutputStream(byteOut);  
  3. out.writeObject(deliverymanreport);//寫對象,序列化  
  4. ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());   
  5.  dv=(Deliverymanreport)in.readObject(); //讀對象,反序列化  
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out= new ObjectOutputStream(byteOut);
out.writeObject(deliverymanreport);//寫對象,序列化
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); 
 dv=(Deliverymanreport)in.readObject(); //讀對象,反序列化

序列化經常用於文件傳遞的讀取。尤其是在緩存中用得比較多,通過序列化可以將對象緩存在硬盤中。這在登錄系統緩存用戶權限和角色等信息最常見。而用對克隆對象,也不失爲一種很好的方法。

發佈了33 篇原創文章 · 獲贊 9 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章