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();
    

我还发现了一些使用JpaDaoSupportJpaTemplate 的示例。你更喜欢哪种设计?我的例子有什么问题吗?

【问题讨论】:

【参考方案1】:

我想说你的方法看起来完全正确。就我个人而言,我不使用JpaDaoSupportJpaTemplate,因为您可以使用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 的 HibernateTemplateJpaTemplate已经提到) 我建议您开始使用 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() 方法?

将分离的实体合并到 JPA 中的实体管理器的最佳方法是啥

spring jpa dao是怎么自动实现的

使用 EntityManager (JPA) 在 DAO 中更新 () 方法的推荐行为?

使用 Spring Boot 框架对基于 Spring JPA 的 DAO 进行分层的正确方法