Мне нужно создать модель данных (в приложении Java EE 6), которая будет сохраняться через JPA, а также должна быть сериализована через JAXB. В последний раз, когда я это делал, у меня была одна группа классов сущностей с аннотациями JAXB, а другая - с аннотациями JPA. Это означало, что для перевода между ними я должен был иметь много кода шаблона. Я думаю о их объединении, так что каждый класс будет иметь оба типа аннотаций. Я знаю это можно сделаем, но на мой вопрос, обязательно это будет? Это вызовет проблемы?Объединение JAXB и JPA в одной модели
ответ
Вопрос для меня слишком широк, чтобы ответить. Но у меня есть определенный опыт, связанный с использованием Jackson под JAXB с сущностями JPA, которые могут показаться вам интересными.
В моем случае у меня была модель JPA с примерно тремя дюжинами сущностей и множеством циклических ссылок. График отношений между сущностями также был почти тесно связан. Другими словами, можно было перейти практически к любому объекту в наборе из любого другого, следуя отношениям сущностей. В моем случае, с сущностями, как описано, и Jackson 1.5, наложение аннотаций JAXB на мои объекты JPA оказалось плохим.
С одной стороны, Джексон 1.5 попал в бесконечную рекурсию по циклическим ссылкам. Я считаю ошибку оператора ошибкой, а не ошибкой. Джексон - потрясающее программное обеспечение. Кроме того, я думаю, что предстоящий выпуск 1.6 предоставляет новые функции для обработки этого на JACKSON-235. Так что это может быть быстро!
Мое другое затруднение связано с сериализованной компактностью в лице сильно связанных объектов. Сериализация всех моих отношений с сущностью была непрактичной. Я бы сериалировал непристойную сумму нерелевантной информации в каждом запросе наивно, следуя всем отношениям сущности до их полной глубины.
Я хотел указать несколько сериализации объектов JAXB, выбрав один из них с соответствующими полями и отношениями в зависимости от предполагаемого использования. Но, насколько мне известно, JAXB и Jackson не предлагают такой гибкости. Они предлагают значительную гибкость при определении представления - что временного, как выглядят списки и т. Д. - но я не думаю, что для одного объекта возможны множественные представления. Может быть, есть умный способ определить несколько представлений в JAXB или Jackson и переключиться во время выполнения ... Мне было бы интересно узнать, существует ли такая вещь. Возможно, есть функция для этого, о которой я не осведомлен, или о некоторых обманах, которые можно воспроизвести с помощью подкласса. Но я не мог его найти, поэтому в итоге я сдался и пошел с DTO.
Опять же, это все довольно специфично для модели. Возможно, это не проблемы для вас (или, может быть, у вас есть умные решения для этих проблем!)
Да, у меня было ощущение, что циклические ссылки и глубоко вложенные объекты будут проблемой. Но поскольку я разрабатываю модель с нуля, у меня есть больше шансов избежать ее. –
re: несколько сериализаций. Я не уверен, что для JAXB было бы хорошей идеей иметь такую функцию. Я легко вижу что-то подобное, что приводит к совершенно непонятным беспорядкам аннотаций. Наличие нескольких DTO может быть более подробным, но по крайней мере вы всегда можете понять, что происходит. –
DataNucleus позволяет настойчиво использовать JPA для РСУБД (используя JDBC за кулисами) и XML (используя JAXB за кулисами). Он может интерпретировать ваши аннотации JPA как определение того, как выполняется сериализация JAXB. Вы также можете добавить аннотации JAXB, если хотите,
Это может быть сделано. На самом деле я нахожу перспективу сохранения кода для копирования между моделями более проблематичными.
EclipseLink - отличный выбор для этого приложения, поскольку он содержит JPA (EclipseLink - это RI и открытый источник из TopLink) и реализация JAXB.
EclipeLink JAXB (MOXy) также содержит ряд расширений для отображения JPA сущностей в XML:
- XPath base mappings
- Mapping bi-directional relationships (using @XmlInvereseReference)
- Обработка композитных отношения ключевые
- Обработка встроенных ключевых классов
- Обработка java.sql . * типы
Для получения дополнительной информации см:
Я действительно использовал EclipseLink для сохранения, когда этот проект начался, но я обнаружил, что это полная катастрофа, и переключился на Hibernate. Но у меня все еще есть полезная информация с вашего поста, так что спасибо. –
Извините, что у вас был негативный опыт работы с EclipseLink. Форумы EclipseLink - отличное место для получения помощи http://tiny.cc/waxx8. Обратите внимание, что MOXy можно использовать для отображения объектов JPA у любого поставщика непрерывности. –
Вы можете использовать MOXy для привязки XML/JSON, а не для сохранения. Я делаю. – HDave
Смотрите также http://stackoverflow.com/questions/1820428/do-domain-classes-usually-get-jpa-or-jaxb- annotations-or-both/1820445 – skaffman