我有一个列表 (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();
}
然后我得到的列表即 retrived
员工元素已完全初始化但实际列表 employees
没有完全初始化的元素。
问题,我需要了解在 retrieved
的序列化或反序列化过程中可能发生了什么列表已初始化元素,而实际列表 employee
没有。
我不能 100% 确定上面的序列化是否没有调用 getter/setter 方法,所以代理无法初始化。
请注意,我没有调用 employee 的 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
如有任何帮助,我们将不胜感激。提前致谢。
最佳答案
序列化不调用 getters/setters,也不调用构造函数。这是初始化 PersistenceCollection 的 eclipse 调试器。
除非您有一些自定义序列化代码,否则该集合将保持未初始化状态。
你可以尝试在你的代码中添加类似的东西
System.out.println(Hibernate.isInitialized(retrived.get(0).getDepartments()));
它应该打印false
。
或在阅读和反对之前关闭您的 session 。 Eclipse 调试器将在值列中显示类似于 com.sun.jdi.InvocationException occurred invocation method.
的内容。
关于java - 对象序列化以某种方式初始化 hibernate 代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39590780/