Ничто так не заставляет вас иметь слой DAO.
UI <-> Service <-> DAO <-> persistence
Код вашего уровня сеанса - это то, что обычно входит в уровень DAO. То есть небольшие (почти атомарные) операции, такие как сохранение, удаление и т. д.
Сервисный уровень предназначен для изоляции бизнес-логики, которая была бы неудобной на простом уровне хранения. Например, если вы хотите работать с несколькими экземплярами Person одновременно или использовать какую-то очень специфическую бизнес-логику перед сохранением объекта. Другое распространенное использование с RDBM - это управление транзакциями на уровне обслуживания, координируя, возможно, несколько запросов DAO в транзакции.
Во многих простых приложениях уровень обслуживания несколько бессмыслен. Он просто передает операции, как и выше, от UI до DAO - никакой логики не добавлено. В этих случаях я лично не обязательно создавал бы слой DAO, сохранял бы хранилище в сервисе, но реорганизовывал его в тот самый момент, когда он вырастает за пределы простого уровня персистентности.
Другим аспектом является модульное тестирование. Простой слой DAO может быть легко смоделирован, что является аргументом для разделения бизнес-логики и постоянства.