我在服务层实现方面遇到麻烦,我认为我不太了解这个概念。

在DAO实现中,我可以为特定技术和实体(例如,休眠和用户表)编写所有CRUD逻辑,在服务层中,我们对DAO中的实体的所有数据操作使用DAO(例如getUser,loginUser等) ..) 这个可以吗?

如果可以,我有一个简单的问题,我可以在服务层,DAO实现中处理数据库连接(或者在休眠,会话和事务的情况下)吗?

例如,我有一个带有一个Button(加载所有User)的简单GUI,一个表将包含所有User。按下按钮将向所有用户加载表格。

我有一个用于用户实体的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();
    }

}

在Button执行的动作中:
private void buttonActionPerformed(ActionEvent evt) {
    Transaction transaction=HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();
    List<User> users=userService.loadAllUsers();
    loadTableWithUsers(users);
    transaction.commit();
}

可以执行吗?
会话和事务句柄处于正确位置,还是我必须将其放入服务层? ..或者进岛?

编辑1:

如果我有一个接口UserDAO和一个实现UserDAO的UserHibernateDAO,则服务层没有理由存在,不是吗?
因为我可以使用所有方法来管理UserDAO中的“用户”,而UserHibernateDAO可以将所有这些方法用于休眠技术...那么我可以使用UserJdbcDAO,UserMysqlDAO等... mmm ...

编辑2:
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();
}

我不确定,业务方法是这样的方法吗?

谢谢大家

最佳答案

  • 您正在actionPerformed()方法内部处理事务。它明显违反了DAO /服务层
  • 的目的
  • 您的UserService正在接受AbstractDAO,这意味着其他一些代码可能会将错误的DAO实现传递给您的UserService,这会破坏

  • 现在,很少有建议。
  • 您可以为此研究GenericDAO concept。可能适合您的需求
  • 大多数时候,我们不需要像ServiceDAOBusinessDelegate这样的所有图层。因此,问自己是不是真的回答了您的某些问题。如果没有,请摆脱它们。 YAGNI
  • 完全摆脱DAO,并将Hibernate API当作DAO。用您的业务方法处理数据库事务。您可能想阅读此question

  • [编辑]

    编辑后,我的第3条建议没有多大用处。顺便说一下,您将DAO命名如下: UserJdbcDAOUserMysqlDAO等。您的第二个名字意义不大,因为我们使用ORM只是为了避免数据库供应商特定的DAO /查询。如果您的UserMysqlDAO extends UserJdbcDAO可能会开始变得有意义。

    10-07 19:09