2010-10-27 4 views
4

im в затруднении с внедрением сервисного уровня, я думаю, что я не очень хорошо понимал эту концепцию.DAO и сервисный уровень с гибернатом

В реализации DAO я могу написать всю логику CRUD для конкретной технологии и объекта (например, hibernate и User table), а на уровне сервиса мы используем DAO для всех операций с данными для объекта в DAO (например, getUser , loginUser и т. д.), это нормально?

Если это нормально, у меня есть простой вопрос, могу ли я обработать соединение с базой данных (или в случае спящего режима, сеанса и транзакции) в пределах уровня обслуживания, реализации DAO или нет?

Пример: у меня есть простой графический интерфейс с одной кнопкой (загрузка всего пользователя), а таблица будет содержать все Пользователь. Нажатие кнопки загрузит таблицу всем пользователям.

У меня есть объект HibernateDAO для пользователя (UserHibernateDAO), содержащий всю операцию CRUD и сервисный уровень UserService для некоторых конкретных операций с данными пользователя.

ServiceLayer:

public class UserService extends AbstractServiceLayer{ 

    private AbstractDAO dao; 

    public UserService(AbstractDAO dao){ 
    this.dao=dao; 
    } 

    public List<User> loadAllUsers(){ 
    return dao.findAll(); 
    } 

} 

В actionperformed Баттона:

private void buttonActionPerformed(ActionEvent evt) { 
    Transaction transaction=HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction(); 
    List<User> users=userService.loadAllUsers(); 
    loadTableWithUsers(users); 
    transaction.commit(); 
} 

Является ли эта реализация нормально? Сессия и дескриптор транзакции находятся в правильном положении, или я должен поместить его в сервисный уровень? .. или, возможно, в дао?

EDIT1:

Если у меня есть UserDAO интерфейс и UserHibernateDAO, который реализует UserDAO, сервис слой не имеет никаких оснований существует, это не так? Becouse я могу иметь весь метод управления в «USER» в моем UserDAO и UserHibernateDAO реализует все эти методы спящей технологии ... тогда я мог бы иметь UserJdbcDAO, UserMysqlDAO и т.д ... ммм ...

edit2 :

private void buttonActionPerformed(ActionEvent evt) { 
    myBusinessMethod(); 
} 

private void myBusinessMethod(){ 
    Transaction transaction=HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction(); 
    List<User> users=userService.loadAllUsers(); 
    loadTableWithUsers(users); 
    //some other useful operation before close session 
    transaction.commit(); 
} 

им не уверен, бизнес-метод представляет собой метод, как это?

Спасибо всем.

+0

Думаю, я уже ответил на ваш 'edit' :). См. Мое второе предложение. –

ответ

4
  1. Вы обрабатываете транзакцию внутри своего метода actionPerformed(). Его явно поражение цели слоя DAO/Service
  2. Ваш UserService принимает AbstractDAO, что означает какой-либо другой код может передать неправильную реализацию DAO к вашим UserService, что будет винт вещи

Теперь, несколько предложений.

  1. Для этого можно посмотреть GenericDAO concept. Это может подойти вам.
  2. Большую часть времени нам не нужны все эти слои, такие как Service, DAO и BusinessDelegate. Итак, задавайте себе вопрос, что любой из них действительно отвечает на некоторые ваши вопросы. Если нет, избавитесь от них.YAGNI
  3. Избавьтесь от DAO полностью и обработайте свой Hibernate API как свой DAO. Обработать транзакцию базы данных в своих бизнес-методах. Вы можете, как прочитать эту question

[Изменено]

После правки мое третье предложение не имеют большого веса. Кстати, вы называете свои DAO следующим образом; UserJdbcDAO, UserMysqlDAO и т. Д. Ваше второе имя не имеет особого смысла, поскольку мы используем ORM только для того, чтобы избежать специфических DAO-запросов или запросов DB-поставщика. Это может начать иметь смысл, если ваш UserMysqlDAO extends UserJdbcDAO.

+0

@ Adeel Ansari: 1- где я могу обрабатывать транзакции? 2- почему это неверно? Конкретные операции с данными относятся к уровню обслуживания. – blow

+0

@blow: вы можете обрабатывать это в своем методе DAO или Business. Обычно я предпочитаю делать это в своем бизнес-методе. –

+0

@Adeel Ansari: теперь мой genericDao похож на этот http://community.jboss.org/wiki/GenericDataAccessObjects, но я не реализовал DaoFactory. Можете ли вы написать простой пример, чтобы показать мне, как и где обрабатывать сеанс и транзакцию? Я думаю, не понимаю, что означает бизнес-логика. – blow