我在服务层实现方面遇到麻烦,我认为我不太了解这个概念。
在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
,这会破坏现在,很少有建议。
Service
,DAO
和BusinessDelegate
这样的所有图层。因此,问自己是不是真的回答了您的某些问题。如果没有,请摆脱它们。 YAGNI [编辑]
编辑后,我的第3条建议没有多大用处。顺便说一下,您将DAO命名如下:
UserJdbcDAO
,UserMysqlDAO
等。您的第二个名字意义不大,因为我们使用ORM只是为了避免数据库供应商特定的DAO /查询。如果您的UserMysqlDAO extends UserJdbcDAO
可能会开始变得有意义。