使用hibernate的DAO和服务层

blo*_*low 4 java session dao hibernate transactions

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

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

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

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

我有一个HibernateDAO for User实体(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();
    }

}
Run Code Online (Sandbox Code Playgroud)

在执行Button的行动中:

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

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢大家.

Ade*_*ari 5

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

现在,很少有建议.

  1. 您可以为此研究GenericDAO概念.这可能适合您的需要
  2. 大多数时候,我们是不是需要所有这些层一样Service,DAOBusinessDelegate.所以,质疑自己是否真的回答了你的一些问题.如果没有,摆脱它们.YAGNI
  3. 完全摆脱DAO,并将您的Hibernate API视为您的DAO.处理业务方法中的数据库事务.您可能想阅读这个问题

将帖子

在您编辑后,我的第三个建议没有太大的重量.顺便说一句,您将DAO命名如下; UserJdbcDAO,UserMysqlDAO等你的第二个名字是赚不到太大的意义,因为我们使用的ORM,只是为了避免数据库供应商特定的DAO /查询.如果你的话,它可能会开始有意义UserMysqlDAO extends UserJdbcDAO.