对象序列化以某种方式初始化hibernate代理

时间:2016-09-20 09:43:50

标签: java hibernate serialization proxy

我的域名为(List<Employee>)的hibernate employees返回了名为(session.createQuery().list())的列表employee。此列表的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();
            }

我得到的列表即retrived已完全初始化员工元素,但实际列表employees没有完全初始化的元素。

问题,我需要了解retrieved列表初始化元素的序列化或去动化期间可能发生的情况,而实际列表employee没有。

如果上面的序列化没有调用getter / setter方法,那么我不能100%确定代理是否无法初始化代理。

注意我没有在员工上调用getter来检查它是代理还是初始化,因为我知道调用getter会初始化代理。我只是使用eclise debug inspect变量进行检查。

另外,我在日志中看到的另一件事(部门初始化时):

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

任何帮助将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:1)

序列化不会调用getter / setter,也不会调用构造函数。这是初始化PersistenceCollection的eclipse调试器。

除非您有一些自定义序列化代码,否则该集合将保持未初始化状态。

您可以尝试在代码中添加类似

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

应打印false

或在阅读和对象之前关闭您的会话。 Eclipse调试器将在值列中显示类似com.sun.jdi.InvocationException occurred invoking method.的内容。