2010-07-17 3 views
15

Мне нужно создать модель данных (в приложении Java EE 6), которая будет сохраняться через JPA, а также должна быть сериализована через JAXB. В последний раз, когда я это делал, у меня была одна группа классов сущностей с аннотациями JAXB, а другая - с аннотациями JPA. Это означало, что для перевода между ними я должен был иметь много кода шаблона. Я думаю о их объединении, так что каждый класс будет иметь оба типа аннотаций. Я знаю это можно сделаем, но на мой вопрос, обязательно это будет? Это вызовет проблемы?Объединение JAXB и JPA в одной модели

+0

Смотрите также http://stackoverflow.com/questions/1820428/do-domain-classes-usually-get-jpa-or-jaxb- annotations-or-both/1820445 – skaffman

ответ

7

Вопрос для меня слишком широк, чтобы ответить. Но у меня есть определенный опыт, связанный с использованием Jackson под JAXB с сущностями JPA, которые могут показаться вам интересными.

В моем случае у меня была модель JPA с примерно тремя дюжинами сущностей и множеством циклических ссылок. График отношений между сущностями также был почти тесно связан. Другими словами, можно было перейти практически к любому объекту в наборе из любого другого, следуя отношениям сущностей. В моем случае, с сущностями, как описано, и Jackson 1.5, наложение аннотаций JAXB на мои объекты JPA оказалось плохим.

С одной стороны, Джексон 1.5 попал в бесконечную рекурсию по циклическим ссылкам. Я считаю ошибку оператора ошибкой, а не ошибкой. Джексон - потрясающее программное обеспечение. Кроме того, я думаю, что предстоящий выпуск 1.6 предоставляет новые функции для обработки этого на JACKSON-235. Так что это может быть быстро!

Мое другое затруднение связано с сериализованной компактностью в лице сильно связанных объектов. Сериализация всех моих отношений с сущностью была непрактичной. Я бы сериалировал непристойную сумму нерелевантной информации в каждом запросе наивно, следуя всем отношениям сущности до их полной глубины.

Я хотел указать несколько сериализации объектов JAXB, выбрав один из них с соответствующими полями и отношениями в зависимости от предполагаемого использования. Но, насколько мне известно, JAXB и Jackson не предлагают такой гибкости. Они предлагают значительную гибкость при определении представления - что временного, как выглядят списки и т. Д. - но я не думаю, что для одного объекта возможны множественные представления. Может быть, есть умный способ определить несколько представлений в JAXB или Jackson и переключиться во время выполнения ... Мне было бы интересно узнать, существует ли такая вещь. Возможно, есть функция для этого, о которой я не осведомлен, или о некоторых обманах, которые можно воспроизвести с помощью подкласса. Но я не мог его найти, поэтому в итоге я сдался и пошел с DTO.

Опять же, это все довольно специфично для модели. Возможно, это не проблемы для вас (или, может быть, у вас есть умные решения для этих проблем!)

+0

Да, у меня было ощущение, что циклические ссылки и глубоко вложенные объекты будут проблемой. Но поскольку я разрабатываю модель с нуля, у меня есть больше шансов избежать ее. –

+0

re: несколько сериализаций. Я не уверен, что для JAXB было бы хорошей идеей иметь такую ​​функцию. Я легко вижу что-то подобное, что приводит к совершенно непонятным беспорядкам аннотаций. Наличие нескольких DTO может быть более подробным, но по крайней мере вы всегда можете понять, что происходит. –

1

DataNucleus позволяет настойчиво использовать JPA для РСУБД (используя JDBC за кулисами) и XML (используя JAXB за кулисами). Он может интерпретировать ваши аннотации JPA как определение того, как выполняется сериализация JAXB. Вы также можете добавить аннотации JAXB, если хотите,

9

Это может быть сделано. На самом деле я нахожу перспективу сохранения кода для копирования между моделями более проблематичными.

EclipseLink - отличный выбор для этого приложения, поскольку он содержит JPA (EclipseLink - это RI и открытый источник из TopLink) и реализация JAXB.

EclipeLink JAXB (MOXy) также содержит ряд расширений для отображения JPA сущностей в XML:

Для получения дополнительной информации см:

+0

Я действительно использовал EclipseLink для сохранения, когда этот проект начался, но я обнаружил, что это полная катастрофа, и переключился на Hibernate. Но у меня все еще есть полезная информация с вашего поста, так что спасибо. –

+0

Извините, что у вас был негативный опыт работы с EclipseLink. Форумы EclipseLink - отличное место для получения помощи http://tiny.cc/waxx8. Обратите внимание, что MOXy можно использовать для отображения объектов JPA у любого поставщика непрерывности. –

+1

Вы можете использовать MOXy для привязки XML/JSON, а не для сохранения. Я делаю. – HDave