我在服务层的实现方面遇到了麻烦,我想我不太了解这个概念。
在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();
}
我不确定,商业方法是这样的方法吗?
谢谢大家。
答案 0 :(得分:5)
actionPerformed()
方法处理交易。它明显地击败了DAO /服务层的目的UserService
正在接受AbstractDAO
,这意味着其他一些代码可能会将错误的DAO实施传递给您的UserService
,这将会搞砸了现在,很少有建议。
Service
,DAO
和BusinessDelegate
等所有这些图层。所以,质疑自己是否真的回答了你的一些问题。如果没有,摆脱它们。 YAGNI <强> [编辑] 强>
在您编辑后,我的第三个建议没有太大的重量。顺便说一句,您将DAO命名如下; UserJdbcDAO
,UserMysqlDAO
等等。您的第二个名称没有多大意义,因为我们使用ORM只是为了避免数据库供应商特定的DAO /查询。如果你的UserMysqlDAO extends UserJdbcDAO
。