Спящие и Сериализуемые Сущности - PullRequest
2 голосов
/ 06 июля 2010

Кто-нибудь знает, существует ли какая-либо инфраструктура, способная вырезать коллекции 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);

1 Ответ

3 голосов
/ 06 июля 2010

Бульдозер хорошо работает для этого. Просто сопоставьте экземпляр компонента с его копией.

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

При отображении экземпляра на новый экземпляр Dozer игнорирует любую конкретную реализацию времени выполнения, используемую для коллекций, и вместо этого использует стандартные реализации или любые классы по умолчанию.

Я посмотрел на BeanLib, но, похоже, он только делает глубокие копии сущностей, не позволяя мне указывать отображения реализации для типов коллекций в моих классах сущностей.

Мне любопытно, почему это важно, какая реализация используется для типов вашей коллекции? Рекомендуется, чтобы ваши постоянные классы ссылались на List, Set и т. Д., Фактические реализации не должны иметь значения для тех, кто использует эти классы - они просто заботятся о данных.

...