使用hibernate的DAO和服务层

时间:2010-10-27 08:57:08

标签: java hibernate session transactions dao

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

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

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

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

我有一个包含所有CRUD操作的HibernateDAO for User实体(UserHibernateDAO)和一个服务层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();
}

这个实现可以吗? 会话和事务处理是在正确的位置还是我必须将其放入服务层? ..或者也许是dao?

EDIT1:

如果我有一个UserDAO接口和一个实现UserDAO的UserHibernateDAO,服务层没有理由存在,是不是真的? Becouse我可以使用所有方法管理我的UserDAO中的“USER”,UserHibernateDAO为hibernate技术实现所有这些方法......然后我可以拥有UserJdbcDAO,UserMysqlDAO等... mmm ...

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();
}

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

谢谢大家。

1 个答案:

答案 0 :(得分:5)

  1. 您正在使用actionPerformed()方法处理交易。它明显地击败了DAO /服务层的目的
  2. 您的UserService正在接受AbstractDAO,这意味着其他一些代码可能会将错误的DAO实施传递给您的UserService,这将会搞砸了
  3. 现在,很少有建议。

    1. 您可以查看GenericDAO concept。这可能适合您的需要
    2. 大多数情况下,我们不需要ServiceDAOBusinessDelegate等所有这些图层。所以,质疑自己是否真的回答了你的一些问题。如果没有,摆脱它们。 YAGNI
    3. 完全摆脱DAO,并将您的Hibernate API视为您的DAO。处理业务方法中的数据库事务。您可能希望阅读此question
    4. <强> [编辑]

      在您编辑后,我的第三个建议没有太大的重量。顺便说一句,您将DAO命名如下; UserJdbcDAOUserMysqlDAO等等。您的第二个名称没有多大意义,因为我们使用ORM只是为了避免数据库供应商特定的DAO /查询。如果你的UserMysqlDAO extends UserJdbcDAO

      ,它可能会开始有意义