Как сохранить чистое разделение слоев с помощью Hibernate / ORM? - PullRequest
14 голосов
/ 04 ноября 2011

Как сохранить чистые слои с помощью Hibernate / ORM (или других ORM ...)?

То, что я имею в виду под чистым разделением слоев, это, например, сохранение всего материала Hibernate в слое DAO .

Например, при создании большого CSV потока экспорта мы часто должны выполнять некоторые операции Hibernate, такие как evict, чтобы избежать OutOfMemory ... Заполнение выходного потока принадлежит представлению, но evict принадлежит ДАО.

Что я имею в виду, так это то, что мы не должны помещать операции выселения в интерфейс / службу, и мы не должны помещать бизнес-логику в DAO ... Итак, что мы можем делать в таких ситуациях?

Есть много случаев, когда вам нужно что-то делать, например, выселять, очищать, очищать, обновлять, особенно когда вы немного играете с транзакциями, большими данными или подобными вещами ...

Так как же вы сохраняете четкое разделение слоев с помощью инструмента ORM, такого как Hibernate?


Edit: то, что мне не нравится ни на работе, так это то, что у нас есть собственный абстрактный DAO, который позволяет сервису предоставлять критерий Hibernate в качестве аргумента. Это практично, но для меня в теории служба, которая называет это DAO, не должна знать критерий. Я имею в виду, что мы не должны каким-либо образом импортировать материалы Hibernate в логику бизнес / представление.


Есть ответ, простой или нет?

Ответы [ 11 ]

0 голосов
/ 23 ноября 2011

Мне кажется, нам нужно еще раз взглянуть на слои.(Я надеюсь, что кто-то исправит меня, если я пойму это неправильно.)

  1. Front End / UI
  2. Business
  3. Сервис / DAO

Таким образом, в случае создания отчета слои разбиваются следующим образом.

  1. Front End / UI
    • будет иметь пользовательский интерфейс с кнопкой «Получить отчет»
    • кнопка будет затемвызовите бизнес-уровень, который знает, о чем этот отчет.
    • Данные, возвращаемые генератором отчетов, получают окончательное форматирование перед возвращением пользователю.
  2. Business
    • MyReportGenerator.GenerateReportData() или аналогичные будут называться
  3. Сервис / DAO
    • внутрибудет использован генератор отчетов DAO.DAOLocator.GetDAO(Entity.class);или аналогичные методы фабричного типа будут использоваться для получения DAO.возвращенные DAO расширят общий интерфейс DAO
...