JPA 和 DAO - 标准方法是啥?
Posted
技术标签:
【中文标题】JPA 和 DAO - 标准方法是啥?【英文标题】:JPA and DAO - what's the standard approach?JPA 和 DAO - 标准方法是什么? 【发布时间】:2011-04-22 08:03:45 【问题描述】:我正在使用 JPA/Hibernate 和 Spring 开发我的第一个应用程序。我第一次尝试 DAO 课程如下所示:
@Repository(value = "userDao")
public class UserDaoJpa implements UserDao
@PersistenceContext
private EntityManager em;
public User getUser(Long id)
return em.find(User.class, id);
public List getUsers()
Query query = em.createQuery("select e from User e");
return query.getResultList();
我还发现了一些使用JpaDaoSupport
和JpaTemplate
的示例。你更喜欢哪种设计?我的例子有什么问题吗?
【问题讨论】:
【参考方案1】:我想说你的方法看起来完全正确。就我个人而言,我不使用JpaDaoSupport
或JpaTemplate
,因为您可以使用EntityManager
和Criteria Queries 完成所需的一切。
引用自JavaDoc of JpaTemplate:
JpaTemplate 主要作为 JdoTemplate 和 HibernateTemplate 的兄弟存在,为习惯它的人提供相同的样式。对于新启动的项目,请考虑采用标准 JPA 样式来编码数据访问对象,基于通过 Spring bean 定义或 JPA PersistenceContext 注解注入的“共享 EntityManager”引用。
【讨论】:
【参考方案2】:我更喜欢无模板方法(即您当前的方法),因为
侵入性较小,您无需将 DAO 绑定到 Spring 对于使用未经检查的异常的 API,模板没有多大价值这是 Spring 的推荐,正如博文“So should you still use Spring's HibernateTemplate and/or JpaTemplate??”和官方 javadoc 中总结的那样:
真正的问题是:选择哪种方法??
(...)
简而言之(作为 JavaDoc 的
HibernateTemplate
和JpaTemplate
已经提到) 我建议您开始使用Session
和/或EntityManager
API 如果你开始使用直接 Hibernate 或 JPA 分别在一个新的 项目——记住:春天试图成为 非侵入性的,这是另一个很棒的 例子!
【讨论】:
+@Pascal 我要在 dao 中注入 entityManager 吗?我对春天比较陌生。你能指点我同样的application.xml参考吗?我正在使用hibernate,这些dao在webapplication中(所以需要使用spring webappcontext?)【参考方案3】:我个人更喜欢您的方法 - 注入 EntityManager
并直接使用它。但是JpaTemplate
也是一个不错的选择。我不喜欢它,因为增加了另一个不必要的抽象层。
【讨论】:
【参考方案4】:我不知道是否有“标准”方法。
如果您使用 JPA,您可以选择实现方式:Hibernate、TopLink 等。
如果您部署到 Google App Engine,您将使用 JPA 与 BigTable 对话。
因此,如果您的目标是最大限度地提高可移植性,坚持使用 JPA 标准,并且不将自己束缚于 Hibernate 等特定实现,请确保您的 DAO 仅使用 JPA 构造。
【讨论】:
对不起 Pascal,如果我没记错的话,这不是你第一次向我指出这一点。我已经从记忆中删除了这个想法。错误已更正 - 谢谢。 我希望这种公开的尴尬能持续一段时间。 8) 停下来——你激起了我对 iPad 的嫉妒。现在还为时过早... 我解除了公开的尴尬,我心情不好:) 别担心 - 这是它有希望坚持下去的唯一方法。以上是关于JPA 和 DAO - 标准方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用 JPA 获取集合时避免 N+1 和笛卡尔积问题的标准方法是啥
如何使用 EntityManager (JPA) 在 DAO 中实现 update() 方法?