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

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

16
задан Mike Baranczak 17 July 2010 в 00:24
поделиться

3 ответа

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

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

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

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

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

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

8
ответ дан 30 November 2019 в 22:30
поделиться

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

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

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

Более подробную информацию смотрите:

9
ответ дан 30 November 2019 в 22:30
поделиться

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

1
ответ дан 30 November 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: