2016-09-20 87 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就在那里。 –