Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top