2016-09-20 64 views
3

我有一個列表(List<Employee>)與名稱employees由hibernate (session.createQuery().list())返回爲我的域employee。此列表的員工元素具有外部關鍵元素的代理,如department,由employee.getDepartment()獲取。對象序列化初始化休眠代理

但是當我做:

{ 
       FileOutputStream fout = new FileOutputStream("d:\\addresss.ser"); 
       ObjectOutputStream oos = new ObjectOutputStream(fout); 
       oos.writeObject(employees); 
       oos.close(); 
       fout.close(); 


       ObjectInputStream ois= new ObjectInputStream(new FileInputStream("d:\\addresss.ser")); 
       List<Employee> retrived=(List<Employee>)ois.readObject(); 
       ois.close(); 
      } 

名單,我得到那麼IE retrived擁有員工元素完全初始化,但實際列表employees沒有完全初始化的元素。

問題,我需要了解在序列化或脫分階段可能發生的情況,即retrieved列表已初始化元素,而實際列表employee沒有。

我不是100%確定如果上面的序列化沒有調用getter/setter方法,所以沒有辦法代理被初始化。

注意我沒有打電話給員工getter來檢查它是代理還是初始化,因爲我知道調用getter會初始化代理。我只是檢查使用eclise調試檢查變量。

此外,還有一件事我在日誌中看到的(當部門被初始化):

System.out.println("class:"+((Employee)employees.get(0)).getDepartment().getClass().getSimpleName()); 
//prints: "Department_$$_jvstfcc_41" 


    System.out.println("class:"+((Employee)retrived.get(0)).getDepartment().getClass().getSimpleName()); 
//prints: "Department" 

一些信息: employee.hbm.xml包含:

<many-to-one 
      name="department" 
        column="department_id" 
     > 

Hibernate的版本:4.3.4.Final

任何幫助將不勝感激。提前致謝。

+0

請注意,像_ Department _ $$ _ jvstfcc_41這樣的返回名稱的object.getClass()仍然處於初始化狀態。更多信息檢查:object.getHandler()。isUninitialized –

+0

你使用哪個hibernate版本?你能發佈你的映射嗎?我用Hibernate 4.3.10和@ManyToOne做了一個小測試,並且序列化之前和之後的類名相同。 – ike3

+0

只是。你的班級名稱就像Class或Class _ $$ _ blabla? –

回答

1

序列化不會調用getters/setters,都不是構造函數。這是初始化PersistenceCollection的eclipse調試器。

除非您有一些自定義的序列化代碼,否則集合將保持未初始化狀態。

你可以嘗試添加到您的代碼像

System.out.println(Hibernate.isInitialized(retrived.get(0).getDepartments())); 

它應該打印false

或在閱讀和對象之前關閉您的會話。 Eclipse調試器將在值列中顯示類似com.sun.jdi.InvocationException occurred invoking method.的內容。

+0

請查看更新,反序列化將代理類名稱轉換爲真實類名。 –

+0

請注意,除部門外沒有部門,因此PersistenceCollection不存在,HibernateProxy就在那裏。 –