JAXb, гибернация и компоненты

#java #hibernate #jaxb

#java #гибернация #jaxb

Вопрос:

В настоящее время я работаю над проектом с веб-сервисом Spring, hibernate и JAXb.

1) Я сгенерировал компоненты гибернации, используя IDE ‘генерацию кода гибернации,

2) кроме того, я сгенерировал компоненты jaxb с помощью компилятора maven.

..

Теперь мой вопрос,

1) Это правильный подход? (иметь так много компонентов).

2) Должен ли я использовать компоненты JAXb для обработки на уровне сервиса? Как я могу сохранить разделение слоев?

3) Или мне нужно создать другой набор компонентов, т.Е.. сопоставить (компоненты JAXb) с (новыми компонентами) с (компонентами гибернации)?

.

Пожалуйста, расскажите о своих взглядах?

Спасибо, ади

Ответ №1:

Вы знаете, вы не можете полностью отделить все. Всегда будет слой, который будет знать два других слоя.

Обычно, когда я разрабатываю 3-уровневую архитектуру, например:

  1. Сервисный уровень — тот, который, вероятно, использует JAXB, предоставляет веб-службы или другие API
  2. Бизнес-уровень — любая реальная логика
  3. Уровень сохраняемости — гибернация

Я разрешаю бизнес-уровню знать о сервисном уровне (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, мы предоставляем ряд расширений, чтобы упростить это:


Обновить

В ответ на:

Согласитесь с тем, что вы говорите. Однако использование одних и тех же компонентов будет очень тесно связывать код и будет сильно зависеть. Изменения в одном слое потребуют изменений и в других местах. Что вы скажете?

Все зависит от того, как вы смотрите на вещи. Я предпочитаю создавать службы доступа к данным, чтобы спроектировать и построить надежную модель предметной области. Затем используйте JPA и JAXB для устранения несоответствий импеданса между объектно-реляционным и объектно-XML.

Подход с одной моделью

Использование одной модели как для JPA, так и для JAXB означает, что при внесении изменений в модель вам нужно решить, как это будет обрабатываться как для JPA, так и для JAXB (это может быть хорошо или плохо). Если вы не хотите, чтобы каждое новое дополнение к модели влияло на отображение JAXB, вы можете использовать такие концепции JAXB, как @XmlAccessorType(XmlAccessType.NONE) .

Две (или более) модели подходят

Если вы хотите добавить поле, сопоставленное как с реляционным, так и с XML, вам нужно добавить его в две модели и добавить необходимую логику преобразования. В этом случае сохранение разъединенных моделей сопряжено с определенными затратами.

Комментарии:

1. Согласитесь с тем, что вы говорите. Однако использование одних и тех же компонентов будет очень тесно связывать код и будет сильно зависеть. Изменения в одном слое потребуют изменений и в других местах. Что вы скажете?

2. как бы вы справились со случаем, когда у вас есть несколько компонентов уровня данных? например: JPA и opencsv или другие текстовые компоненты? Делает ли объединение всех этих функций по-прежнему бессмысленным?