2010-07-06 92 views
2

有谁知道是否有一个框架能够从实体类中去除Hibernate集合以使它们可序列化?我看了看BeanLib,但它似乎只做了实体的深层副本,而不允许我为实体类中的集合类型指定实现映射。 BeanLib目前不支持Hibernate 3.5和Spring 3(我修改了源代码并能够使其工作,但我宁愿不这样做)。基列似乎是一种选择,但它似乎相当侵略性。我宁愿使用简单的深层复制框架,而不是将另一个框架编织到我的实体和DAO类中。休眠和可序列化实体

我已经尝试使用XStream与自定义的CollectionConverter和MapConverter成功,但是...这是XStream,我真的不想将我的实体转换为XML,然后从内存中的XML返回。这是一个可怕的解决方案。

我只需要创建自己的框架,就像XStream一样减去所有的XML内容?

我的技术堆栈是:GWT 2.0.4,GWT-Dispatch,Spring 3.0.1和Hibernate 3.5.2。

我XStream的解决方案:

XStream xstream = new XStream(); 

xstream.addDefaultImplementation(java.util.ArrayList.class, org.hibernate.collection.PersistentList.class); 
xstream.addDefaultImplementation(java.util.HashMap.class, org.hibernate.collection.PersistentMap.class); 
xstream.addDefaultImplementation(java.util.HashSet.class, org.hibernate.collection.PersistentSet.class); 
xstream.addDefaultImplementation(java.util.ArrayList.class, org.hibernate.collection.PersistentBag.class); 

Mapper mapper = xstream.getMapper(); 
xstream.registerConverter(new HibernateCollectionConverter(mapper)); 
xstream.registerConverter(new HibernateMapConverter(mapper)); 

String xml = xstream.toXML(entity); 
Entity newEntity = (Entity) xstream.fromXML(xml); 

回答

3

Dozer很适合这一点。简单地将bean实例映射到它自己的副本。

obj = dozerBeanMapper.map(obj, obj.getClass()); 

在该实例映射到一个新的实例,推土机忽略任何具体的运行时实现用于收藏,而不是使用标准的实施或任何你的类默认。

我看了一下BeanLib,但它似乎只做了实体的深层副本,而不允许我为实体类中的集合类型指定实现映射。

我很好奇,为什么它关系到你的集合类型使用了什么实现?作为最佳实践,对于持久化类来说,最好是参考List,Set等,对于使用这些类的任何人来说,实际的实现应该不重要 - 他们只关心数据。

+0

它使用什么实现无关紧要。 Hibernate使用它自己的集合实现,如PersistentBag for java.util.List,它们是不可序列化的。深拷贝框架似乎复制这些集合。我需要指定java.util.List接口的可序列化实现。所以PersistentBag - > java.util.ArrayList。 – 2010-07-06 03:27:59

+0

推土机将用标准实现替换Hibernate代理 - ArrayList,HashSet等。这就是为什么我提出这个问题,对不起,如果这部分内容不清楚。 – 2010-07-06 03:53:48

+0

谢谢。我试了一下,它运行良好。 – 2010-07-06 06:42:20