Объекты доступа к данным (DAO) - это общий шаблон проектирования и рекомендуется Sun. Но самые ранние примеры Java DAO напрямую взаимодействовали с реляционными базами данных - они, по сути, выполняли объектно-реляционное сопоставление (ORM). В настоящее время я вижу DAO поверх зрелых инфраструктур ORM, таких как JDO и Hibernate, и мне интересно, действительно ли это хорошая идея.Зачем класть слой DAO поверх слоя сохранения (например, JDO или Hibernate)
Я занимаюсь разработкой веб-службы с использованием JDO в качестве уровня сохранения, и я рассматриваю вопрос о том, следует ли вводить DAO. Я предвижу проблемы при работе с конкретным классом, который содержит карту других объектов:
public class Book {
// Book description in various languages, indexed by ISO language codes
private Map<String,BookDescription> descriptions;
}
СДО достаточно умно, чтобы отобразить это ограничение внешнего ключа между «Книгой» и «BOOKDESCRIPTIONS» таблицей. Он прозрачно загружает объекты BookDescription (с использованием ленивой загрузки, я считаю), и сохраняет их, когда объект Book сохраняется.
Если бы я должен был ввести «уровень доступа к данным» и написать класс, подобный BookDao, и инкапсулировать весь код JDO внутри этого, то разве прозрачная загрузка JDO дочерних объектов не будет обходить слой доступа к данным? Для согласованности не должны ли все объекты BookDescription загружаться и сохраняться через некоторый объект BookDescriptionDao (или метод BookDao.loadDescription)? Однако рефакторинг таким образом заставил бы манипулировать моделью без лишних сложностей.
Итак, мой вопрос: что случилось с вызовом JDO (или Hibernate или любого другого ORM, который вы представляете) непосредственно на бизнес-уровне? Его синтаксис уже довольно кратким, и он является хранилищем данных-агностиком. В чем преимущество, если таковое имеется, инкапсуляции в объекты доступа к данным?
Спасибо за ответы до сих пор. Я вижу, что в некоторых случаях шаблон DAO может решить * немедленную * потребность, например, когда вам нужен специальный код для извлечения объекта, обработка ошибок и т. Д. Но в других случаях это больше теоретические дебаты («поддерживаемость» одного человека «это преждевременная абстракция другого человека» без окончательного ответа. –
Чтобы дать некоторый задний вопрос, мой интерес к DAO был изначально как средство для решения неотложной задачи, а именно инъекции зависимостей в объекты, загруженные JDO. Но с тех пор я нашел то, что я считаю лучшим решением: метод AddInstanceLifecycleListener() JDO. –
Прошло несколько месяцев ... в конце концов я * сделал * введя уровень доступа к данным поверх JDO, чтобы инкапсулировать аспекты безопасности (ограничение того, какие объекты видимы или редактируются текущим пользователем). –