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