Получают ли доменные классы аннотации JPA или JAXB или и то, и другое? - PullRequest
12 голосов
/ 30 ноября 2009

У меня есть корпоративное Java-приложение, которое предоставляет веб-сервис, имеет уровень домена и уровень персистентности гибернации. В данном конкретном случае нет большой разницы (на данный момент) между объектами, которые я отправляю по проводам, объектами домена и объектами постоянства.

В настоящее время приложение использует DTO на персистентной стороне и аннотирует классы домена аннотациями JAXB. Однако чем больше я читаю и думаю об этом, тем больше это кажется задом наперед! (Не говоря уже о том, что между объектами DTO и Domain много бессмысленного кода, поддерживающего бездумное.) Кажется, что большинство архитекторов предлагают помещать аннотации JPA в модель домена и создавать DTO для отправки объектов по проводам.

В моем случае, могу ли я разместить аннотации JAXB и JPA (Hibernate) на классах моего домена?

Мысль о том, что мой фасад веб-службы, мой домен и мое упорство тесно связаны друг с другом, кажется простым в поддержании, но меня это беспокоит, поскольку со временем они могут измениться. Но будет ли разумнее создать набор классов DTO для стороны веб-сервисов и пропустить DTO для стороны персистентности?

Ответы [ 5 ]

11 голосов
/ 30 ноября 2009

Нет функциональной причины для того, чтобы не аннотировать один и тот же класс аннотациями как JPA, так и JAXB, иногда я делал это сам. Тем не менее, его становится немного трудно читать, и иногда вам нужны различные компромиссы в дизайне классов с JAXB и JPA. По моему опыту, эти компромиссы обычно означают, что в итоге вы получаете две модели класса.

5 голосов
/ 06 июля 2010

Я согласен, что использование одних и тех же классов моделей является правильным подходом. Если вас беспокоит беспорядок аннотаций, вы можете использовать реализацию JAXB (например, EclipseLink JAXB ), которая предоставляет механизм для экстернализации метаданных:

Кроме того, поскольку вы используете модель JPA, EclipseLink JAXB (MOXy) имеет расширения, облегчающие эту задачу:

Вот пример использования одной модели с JAXB и JPA для создания сервиса RESTful:

2 голосов
/ 30 ноября 2009

Нет проблем в использовании обеих аннотаций в одном классе. Я даже склоняюсь к этому, потому что, таким образом, вам не нужно копировать-вставлять, когда происходят изменения. В некоторых случаях некоторые свойства отличаются по поведению - например, автоматически сгенерированный идентификатор может не потребоваться для маршалинга. @XmlTransient и @Transient затем объединяются. Это становится немного трудно читать, но не слишком сложно, потому что очевидно, что означают все аннотации.

1 голос
/ 08 августа 2012

Я знаю, что этот вопрос немного устарел, но я все равно решил взвесить, поскольку с этой проблемой я недавно столкнулся. Я бы рекомендовал оставить ваши аннотированные классы JAXB в покое, поскольку любое изменение схемы потребует повторной генерации этих классов. Это означает, что вам придется повторно вводить любые спящие аннотации и т. Д. Вручную. Это может быть немного устаревшим решением, но я думаю, что было бы разумно создать файл отображения гибернации (.hbm.xml) для внешнего размещения сопоставлений. Это немного более гибко, менее загромождено и столь же полезно на мой взгляд.

1 голос
/ 01 марта 2012

Кто-нибудь испытывал желание поместить объекты ссылки на атом в ваш постоянный домен, потому что вы взяли на себя обязательство определить там структуру XML вашего веб-сервиса? Мне кажется странным делать это. Ссылки Hateoas кажутся хорошей идеей, но постоянный домен и служба impl (не веб-служба) не интересуются атомными ссылками. С другой стороны, использование xml-аннотаций и сериализация моего домена с помощью jersey для меня определенно удобны. Еще один недостаток этого подхода заключается в том, что с помощью рефакторинга «слоя» персистентного домена можно легко воздействовать на потребителей веб-служб во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...