【发布时间】:2011-05-01 12:53:08
【问题描述】:
我在一些文章中读到 DAO 对 hibernate 不是强制性的,它的实现是“取决于”的,换句话说,我们可以在 ORM 和 DAO 模式之间进行选择。
好的,假设我不想使用 DAO 模式,所以我只使用 hibernate(我的 ORM)提供的会话 CRUD 和查询操作。
特别是对于“搜索”和“查找”查询,总是重写它们是不正确的,因此将它们放入一个类中是合理的。
但是这个类是一个简单的DAO,没有DAO模式和DAOFactory的所有实现,只是一个DAO的轻量级实现。 所以,关键是我们总是需要一个 DAO,而选择是重型 DAO 实现还是轻量级 DAO 实现?
我说错了吗?
编辑 我遇到的另一个问题是在哪里放置 dao 交互,例如我必须登录一个用户并编写登录日志(我知道的无用示例......)
所以在 DAO 模式中,我拥有所有通用的 dao 实现、DAOFactory,最后是 UserHibernateDAO 和 LogHibernateDAO。 登录操作是一个业务方法:
private void login(String username, String password){
daoFactory.beginTransaction();
UserDAO userDao=daoFactory.HIBERNATE.getUserDao();
LogDAO logDao=daoFactory.HIBERNATE.getLogDao();
if(userDao.checkAccount(username, password){
User user=userDao.findByAccount(username, password);
logDao.save(new Log("log-in", user);
}
daoFactory.commit();
}
这合理吗?我可以这样使用 dao 吗? 如果我想处理异常,最好的地方是在业务逻辑中?
EDIT2 让我们假设使用 DAO 模式,这样做的主要原因是能够在技术(ORM->JDBC 等)之间切换,一切都很好,但是我在哪里可以处理休眠会话和事务? 我不能把它放到 DAO 中,它是反模式,我不能把它放到服务层中,因为在一个 hipohtetycal 开关中我必须删除所有这些事务(因为其他技术可能不会使用它们)。
【问题讨论】:
-
也许可以查看我的博客文章。我建议如何将 JPA 与 DAO 模式尽可能直接和干燥地结合起来:codeblock.engio.net/?p=180
标签: java hibernate design-patterns dao