2011-03-21 2 views
1

У меня есть домен класса User со свойствами и добытчикамикакие вещи писать в классе userDAO в Java весной зимуют

Тогда у меня есть класс UserService который Contan все функции, такие как

AddUser DeleteUser

public void register(User person) { 
     logger.debug("Adding new Registration"); 
     Session session = sessionFactory.getCurrentSession(); 
     session.save(person); 
    } 

Я использую спящий режим.

Моя система работает нормально. но я смущен, где UserDAO стоит в моем случае. Нужно ли мне это или что мне нужно писать там

ответ

3

Нет ничего, что заставило бы вас иметь слой DAO.

UI <-> Service <-> DAO <-> persistence 

Код на вашем уровне сеанса - это то, что обычно входит в слой DAO. То есть небольшие (почти атомные) операции, такие как сохранение, удаление и т. д.

Сервисный уровень предназначен для изоляции бизнес-логики, которая была бы неудобной на простом уровне хранения. Например, если вы хотите работать с несколькими экземплярами Person за раз или с какой-то конкретной бизнес-логикой перед сохранением объекта. Другим распространенным использованием RDBM является управление транзакциями на уровне обслуживания, координирующее, возможно, несколько запросов DAO в транзакции.

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

Другим аспектом является модульное тестирование. Простой слой DAO можно легко высмеять, что является аргументом в пользу строгого разделения деловой логики и настойчивости.

0

Как уже указывалось здесь, не обязательно, чтобы вам нужен слой DAO. Если ваш уровень обслуживания не содержит много логики, вы можете найти приемлемым для ввода логики DB/Hibernate. То, что вы не хотите, - это разместить вашу DAO-логику в UI-слое, поскольку она делает тестирование устройства более сложным и беспорядочным.

Другим решением является проверка библиотеки, которая упрощает запись слоя DAO. Hades - такая библиотека, которая во многих случаях дает вам все необходимые методы dao бесплатно. С Аид, ваш DAO-код будет выглядеть следующим образом:

public interface UserDao extends GenericDao<User, Long> { 
} 

Затем вы получите такие методы, как сохраняются, найти (также с подкачкой), граф, удаление и т.д.

0

я пошел с этим подходом в моя последняя работа (в частности, в вашем собственном ответе, Александр), и я обнаружил, что DAO действительно увязли с логикой и отношениями, которые должны были быть в самом пользователе. Я согласен с Мартином, вам действительно не нужен DAO. Во всяком случае, используйте универсальную оболочку SessionFactory, защищенную типами.

public class SessionFactoryWrapper{ 

     private SessionFactory sessionFactory; 

     public <T extends ObjectWithID> T load(long id, Class<T> clazz){ 
      return (T) sessionFactory.getCurrentSession().load(clazz, id); 
     } 

     //... etc... 
    } 

Это заставляет вас взаимодействовать с вашей сессии отвлеченно, и иметь дело с кодом модели уровня в домене, который стремится сохранить код понятнее.

0

DAO обычно содержат операции сохранения данных. С ORDBMS они в основном выполняются CRUD (создание, чтение, обновление, удаление). DAO означает объект доступа к данным.Take a look at generic dao

Несмотря на то, что ваш уровень обслуживания не содержит много бизнес-логики, рекомендуется отделить уровень доступа к данным от уровня обслуживания. Это обычная дилемма, почему мне нужен еще один слой, если мой код достаточно прост, чтобы вписаться в один слой. Indirection and Refactoring

В принципе, если вы выполняете отдельные задачи и обязанности, это помогает сделать код более приспособленным к изменениям. Надеюсь, что ответы на оба вопроса (что и почему)

Смежные вопросы