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)
我不确定,商业方法是这样的方法吗?
谢谢大家.
actionPerformed()方法内的事务.它明显地击败了DAO /服务层的目的UserService正在接受AbstractDAO,这意味着其他一些代码可能会将错误的DAO实施传递给您UserService,这会使事情搞砸现在,很少有建议.
Service,DAO和BusinessDelegate.所以,质疑自己是否真的回答了你的一些问题.如果没有,摆脱它们.YAGNI将帖子
在您编辑后,我的第三个建议没有太大的重量.顺便说一句,您将DAO命名如下; UserJdbcDAO,UserMysqlDAO等你的第二个名字是赚不到太大的意义,因为我们使用的ORM,只是为了避免数据库供应商特定的DAO /查询.如果你的话,它可能会开始有意义UserMysqlDAO extends UserJdbcDAO.