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

标签 java hibernate serialization proxy

我有一个列表 (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/

相关文章:

当我创建对象的新实例作为键时,Java HashMap.get() 返回 null

java - 从与 Hibernate Criteria 的关系投影实体

javascript - 无法从 JS/jQuery 中的序列化 python 对象中获取数据

java - 如何判断字符串中是否存在未知数字?

java - 谷歌应用引擎: Orchestrating Multiple Apps to Deliver a Composite Service

java - 用每个元素的和替换数组的方法

mysql - Grails Hibernate 插入而不是更新表

oracle - 事务超时在 Oracle 的 Hibernate 上不起作用

java - jackson 序列化忽略负值

java - 如何在不实现 Serializable 接口(interface)的情况下序列化/反序列化对象?