Доменные классы обычно получают аннотации JPA или JAXB или и то, и другое?
У меня есть корпоративное приложение Java, которое предоставляет веб-службу, имеет уровень домена и уровень сохранения hibernate. В этом конкретном случае между объектами, которые я отправляю по проводу, объектам домена и объектам сохранения, нет огромной разницы (на данный момент).
В настоящее время приложение использует DTO на стороне персистенции и аннотирует классы домена с аннотациями JAXB. Однако, чем больше я читаю и думаю об этом, тем больше это кажется обратным! (Не говоря уже о том, что существует много кода для поддержки бессмысленных взад и вперед между объектами DTO и Domain). Похоже, что большинство архитекторов предлагают помещать аннотации JPA в модель домена и создавать DTO для отправки объектов по кабелю.
В моем случае могу ли я разместить аннотации JAXB и JPA (Hibernate) на своих классах доменов?
Мысль о том, что мой фасад веб-сервиса, мой домен и моя настойчивость тесно связаны друг с другом, кажутся легкими в обслуживании, но меня это волнует, поскольку они могут со временем меняться. Но было бы разумнее создать набор классов DTO для стороны веб-служб и пропустить DTO для стороны сохранения?
Ответы
Ответ 1
Нет никакой функциональной причины для того, чтобы не аннотировать один и тот же класс с аннотациями JPA и JAXB, я делал это сам по случаю. Это становится немного трудно читать, хотя, и иногда вам нужны разные компромиссы дизайна класса с JAXB и JPA. По моему опыту, эти компромиссы обычно означают, что вы получаете две модели классов.
Ответ 2
Я согласен, что использование тех же классов моделей - правильный подход. Если вас беспокоит беспорядок аннотаций, вы можете использовать реализацию JAXB (например, EclipseLink JAXB), которая обеспечивает механизм для экстернализации метаданных:
Также, поскольку вы используете модель JPA, EclipseLink JAXB (MOXy) имеет расширения для упрощения:
Ниже приведен пример использования одной модели с JAXB и JPA для создания службы RESTful:
Ответ 3
Нет проблем с использованием обеих аннотаций в одном классе. Я даже склонен поощрять это, потому что вам не нужно копировать-вставлять, когда происходят изменения.
В некоторых случаях некоторые свойства отличаются поведением - например, автогенерированный идентификатор может не потребоваться для сортировки. @XmlTransient
и @Transient
затем объединяются. Это становится немного трудно читать, но не слишком сложно, потому что очевидно, что означают все аннотации.
Ответ 4
Кто-нибудь соблазн поместить атомарные объекты ссылок в ваш постоянный домен, потому что вы взяли на себя обязательство определять структуру xml-структуры вашего веб-сервиса? Мне кажется странным это делать. Ссылки Hateoas кажутся хорошей идеей, но сохраняемый домен и служба impl (а не веб-сервис) не интересуются ссылками на атомы. Опять же, использование аннотаций xml и использование jersey для сериализации моего домена для меня, безусловно, удобно. Другим недостатком этого подхода является то, что он легко влияет на пользователей веб-сервисов во время выполнения с рефакторингом домена "уровень".
Ответ 5
Я знаю, что этот вопрос немного устарел, но я думал, что буду взвешивать, так как это проблема, с которой я недавно столкнулся. Моя рекомендация заключалась бы в том, чтобы оставить только аннотированные классы JAXB, так как любое изменение схемы потребует повторного создания этих классов. Это означает, что вам придется повторно вводить аннотации гибернации и т.д. Вручную. Это может быть немного устаревшим решением, но я думаю, что было бы вполне разумно создать файл сопоставления спящего режима (.hbm.xml), чтобы размещать внешние сопоставления. Это немного более гибкий, менее загроможденный и столь же полезный, на мой взгляд.