Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确序列化Hibernate集合?_Java_Hibernate_Serialization_Collections - Fatal编程技术网

Java 如何正确序列化Hibernate集合?

Java 如何正确序列化Hibernate集合?,java,hibernate,serialization,collections,Java,Hibernate,Serialization,Collections,我试图从一个使用Hibernate检索的数据库中序列化对象,我只对对象的实际数据的整体(包括周期)感兴趣 现在我一直在和他合作,这似乎很强大。XStream的问题在于它过于盲目地关注信息。它可以识别Hibernate的PersistentCollections,包括所有Hibernate元数据。我不想序列化这些 那么,是否有一种合理的方法可以从PersistentCollection中提取原始集合,并初始化对象可能指向的所有引用数据。或者你能推荐我一个更好的方法吗 (来自的结果看起来很完美,但它

我试图从一个使用Hibernate检索的数据库中序列化对象,我只对对象的实际数据的整体(包括周期)感兴趣

现在我一直在和他合作,这似乎很强大。XStream的问题在于它过于盲目地关注信息。它可以识别Hibernate的PersistentCollections,包括所有Hibernate元数据。我不想序列化这些

那么,是否有一种合理的方法可以从PersistentCollection中提取原始集合,并初始化对象可能指向的所有引用数据。或者你能推荐我一个更好的方法吗


(来自的结果看起来很完美,但它无法处理诸如Calendar之类的基本util类。它一次只接受一个带注释的对象)

我推荐一种更简单的方法:user dozer:。Dozer是一个bean映射器,您可以使用它将PersonEJB转换为同一类的对象。Dozer将通过getter()调用递归地触发所有代理fecthes,并将src类型转换为dest类型(比如java.sql.date转换为java.utilDate)

下面是一个片段:

MapperIF mapper = DozerBeanMapperSingletonWrapper.getInstance();
PersonEJB serializablePerson = mapper.map(myPersonInstance, PersonEJB.class);

请记住,当dozer遍历您的对象树时,它将触发代理逐个加载,因此如果您的对象图有许多代理,您将看到许多查询,这些查询可能非常昂贵。

通常最好的方法是什么,而我目前的做法是使用另一层DTO对象。通过这种方式,您可以排除不希望通过通道的数据,并限制图形序列化的深度。我将Dozer用于从Hibernate对象到Flex客户端的当前DTO(数据传输对象)

它工作得很好,但有几个注意事项:

  • 它不快,事实上它非常慢。如果发送大量数据,推土机将无法正常工作。这主要是因为在表演它的魔法时涉及到反射
  • 在某些情况下,您必须为特殊行为编写自定义转换器。这些工作非常好,但它们是双向的。我个人不得不破解推土机的来源,以允许单向自定义转换器

这里描述的解决方案对我很有效:


我们的想法是为hibernate集合定制XStream converter/mapper,它将从hibernate one中提取实际集合,并调用相应的标准转换器(用于ArrayList、HashMap等)

这是否需要XML配置文件?