Объединение JAXB и JPA в одной модели - PullRequest
15 голосов
/ 17 июля 2010

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

Ответы [ 3 ]

9 голосов
/ 17 июля 2010

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

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

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

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

7 голосов
/ 17 июля 2010

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

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

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

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

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

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

1 голос
/ 17 июля 2010

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

...