我的域名为(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
任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:1)
序列化不会调用getter / setter,也不会调用构造函数。这是初始化PersistenceCollection的eclipse调试器。
除非您有一些自定义序列化代码,否则该集合将保持未初始化状态。
您可以尝试在代码中添加类似
的内容System.out.println(Hibernate.isInitialized(retrived.get(0).getDepartments()));
应打印false
。
或在阅读和对象之前关闭您的会话。 Eclipse调试器将在值列中显示类似com.sun.jdi.InvocationException occurred invoking method.
的内容。