gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:52:32 26 4
gpt4 key购买 nike

我有一个列表 (List<Employee>)名字employees hibernate 返回 (session.createQuery().list())对于我的域 employee .此列表的员工元素具有外键元素的代理,如 departmentemployee.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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com