2010-07-06 140 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