Объединение JAXB и JPA в одной модели

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

Ответы

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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