有谁知道那里是否有一个能够从实体类中剥离Hibernate集合以使其可序列化的框架?我看了一下BeanLib,但它似乎只做实体的深层副本,而不允许我为实体类中的集合类型指定实现映射。BeanLib当前不适用于Hibernate 3.5和Spring 3(我确实修改了源代码并能够使其正常工作,但我不想这样做)。吉利德(Gilead)似乎是一个选择,但似乎颇具侵略性。我宁愿使用简单的深度复制框架,也不愿将另一个框架编织到我的实体和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);
推土机对此非常有效。只需将bean实例映射到其自身的副本即可。
obj = dozerBeanMapper.map(obj, obj.getClass());
在将实例映射到新实例时,Dozer会忽略用于集合的任何特定运行时实现,而是使用标准实现或您的类默认使用的任何实现。
我看了一下BeanLib,但它似乎只做实体的深层副本,而不允许我为实体类中的集合类型指定实现映射。
我很好奇,为什么对您的集合类型使用哪种实现很重要?由于这是最好的一个最佳实践的持久化类来指代List,Set等等,实际的实现不应该的问题,任何人谁消耗这些类- 他们只关心数据。
List
Set