#java #hibernate #jaxb
#java #гибернация #jaxb
Вопрос:
В настоящее время я работаю над проектом с веб-сервисом Spring, hibernate и JAXb.
1) Я сгенерировал компоненты гибернации, используя IDE ‘генерацию кода гибернации,
2) кроме того, я сгенерировал компоненты jaxb с помощью компилятора maven.
..
Теперь мой вопрос,
1) Это правильный подход? (иметь так много компонентов).
2) Должен ли я использовать компоненты JAXb для обработки на уровне сервиса? Как я могу сохранить разделение слоев?
3) Или мне нужно создать другой набор компонентов, т.Е.. сопоставить (компоненты JAXb) с (новыми компонентами) с (компонентами гибернации)?
.
Пожалуйста, расскажите о своих взглядах?
Спасибо, ади
Ответ №1:
Вы знаете, вы не можете полностью отделить все. Всегда будет слой, который будет знать два других слоя.
Обычно, когда я разрабатываю 3-уровневую архитектуру, например:
- Сервисный уровень — тот, который, вероятно, использует JAXB, предоставляет веб-службы или другие API
- Бизнес-уровень — любая реальная логика
- Уровень сохраняемости — гибернация
Я разрешаю бизнес-уровню знать о сервисном уровне (JAXB) и о уровне сохраняемости (компоненты гибернации). Но я не позволяю уровню обслуживания и уровню сохраняемости знать друг о друге.
Комментарии:
1. Спасибо, очень признателен. Итак, наличие компонентов JAXb и гибернационных компонентов — это нормально? В этом случае мне нужно будет выполнить сопоставление компонентов jaxb-> hibernate на бизнес-уровне. Так ли это?
2. Да. По моему опыту, обычно компоненты уровня обслуживания и компоненты уровня сохраняемости не идентичны. Вы можете думать о них как об идентичных, когда начинаете проектирование, но позже уровень API имеет один вид последствий, в то время как уровень сохраняемости может иметь другой вид.
3. ОК. На самом деле я просто боюсь делать отображение, используя, например, классы JAXBElement на бизнес-уровне. Таким образом, мой бизнес-уровень привязан к веб-сервисам. Если мне нужно написать другого клиента (которому необходим доступ к бизнес-уровню), это не будет хорошо.
4. Я не говорил, что бизнес-уровень будет использовать классы JAXB внутри. Но он будет получать их с сервисного уровня. Ваша проблема не имеет полностью правильного или полностью неправильного решения. Попытайтесь найти баланс.
5. 1 для «Ваша проблема не имеет полностью правильного или полностью неправильного решения. Попытайтесь найти баланс «.
Ответ №2:
Примечание: я являюсь руководителем EclipseLink JAXB (MOXy) и членом экспертной группы JAXB 2 (JSR-222). EclipseLink также предоставляет отличную реализацию JPA (с открытым исходным кодом от TopLink).
Поддержка нескольких моделей требует затрат. Каждая добавляемая вами модель представляет преобразование компонента в компонент, которое необходимо записать, протестировать и поддерживать.
Другой подход заключается в использовании одних и тех же компонентов как для привязок JPA, так и для JAXB. Для этого варианта использования будет проще начать с модели домена и добавить метаданные JAXB и JPA, чтобы применить сопоставления к XML и базе данных. Ниже приведен пример использования одной модели для создания веб-службы RESTful:
Поскольку EclipseLink предоставляет как реализации JAXB, так и JPA, мы предоставляем ряд расширений, чтобы упростить это:
- http://wiki.eclipse.org/EclipseLink/Examples/MOXy/JPA
- http://blog.bdoughan.com/2010/07/jpa-entities-to-xml-bidirectional.html
Обновить
В ответ на:
Согласитесь с тем, что вы говорите. Однако использование одних и тех же компонентов будет очень тесно связывать код и будет сильно зависеть. Изменения в одном слое потребуют изменений и в других местах. Что вы скажете?
Все зависит от того, как вы смотрите на вещи. Я предпочитаю создавать службы доступа к данным, чтобы спроектировать и построить надежную модель предметной области. Затем используйте JPA и JAXB для устранения несоответствий импеданса между объектно-реляционным и объектно-XML.
Подход с одной моделью
Использование одной модели как для JPA, так и для JAXB означает, что при внесении изменений в модель вам нужно решить, как это будет обрабатываться как для JPA, так и для JAXB (это может быть хорошо или плохо). Если вы не хотите, чтобы каждое новое дополнение к модели влияло на отображение JAXB, вы можете использовать такие концепции JAXB, как @XmlAccessorType(XmlAccessType.NONE)
.
Две (или более) модели подходят
Если вы хотите добавить поле, сопоставленное как с реляционным, так и с XML, вам нужно добавить его в две модели и добавить необходимую логику преобразования. В этом случае сохранение разъединенных моделей сопряжено с определенными затратами.
Комментарии:
1. Согласитесь с тем, что вы говорите. Однако использование одних и тех же компонентов будет очень тесно связывать код и будет сильно зависеть. Изменения в одном слое потребуют изменений и в других местах. Что вы скажете?
2. как бы вы справились со случаем, когда у вас есть несколько компонентов уровня данных? например: JPA и opencsv или другие текстовые компоненты? Делает ли объединение всех этих функций по-прежнему бессмысленным?