JPA和DAO - 什么是标准方法?

6

我正在使用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的例子。你更喜欢哪种设计?我的示例是否有任何问题?

4个回答

6
我认为你的方法看起来非常可靠。个人而言,我不使用JpaDaoSupportJpaTemplate,因为你可以使用EntityManager和Criteria Queries实现所需的一切。
引用自JpaTemplate的JavaDoc

JpaTemplate主要作为JdoTemplate和HibernateTemplate的同级存在,为习惯于此类模板的开发者提供相同的风格。对于新项目,请考虑采用标准的JPA编码数据访问对象的方式,该方式基于通过Spring bean定义或JPA PersistenceContext注解注入的"shared EntityManager"引用。


4

我更喜欢无模板方法(即你目前的方法),因为

  • 它不会过度干扰,不会将DAO与Spring绑定在一起
  • 在使用未经检查的异常的API时,模板没有太多价值

这也是Spring推荐的方法,如在博客文章“So should you still use Spring's HibernateTemplate and/or JpaTemplate??”和官方Javadoc中所总结的:

真正的问题是:选择哪种方法?

(...)

简而言之(正如 HibernateTemplateJpaTemplate的JavaDoc中已经提到的那样) 如果您正在新项目上开始使用Hibernate或JPA,则建议您直接使用 Session和/或EntityManager API - 记住:Spring试图保持非侵入性,这是另一个很好的例子!


+@Pascal,我该如何在DAO中注入EntityManager?我对Spring相对较新,请问你能否指向相应的application.xml参考文档?我正在使用Hibernate,并且这些DAO位于Web应用程序中(因此需要使用Spring WebAppContext吗?) - Jigar Shah

2

我个人更喜欢你的方式——注入EntityManager并直接使用它。但是JpaTemplate也是一个不错的选择。我不喜欢它,因为它增加了另一个不必要的抽象层。


1

我不知道是否存在“标准”方法。

如果您正在使用JPA,则可以选择Hibernate、TopLink等实现方式。

如果您部署到Google App Engine,则将使用JPA与BigTable通信。

因此,如果您的目标是最大化可移植性,请坚持使用JPA标准,而不要将自己捆绑在特定的实现(如Hibernate)上,确保您的DAO仅使用JPA构造。


抱歉 Pascal,如果我没记错的话,这不是你第一次向我指出这一点了。我已经将那个想法从记忆中清除了。错误已经纠正 - 谢谢。 - duffymo
我希望这种公开尴尬的感觉能够留给我更长一点时间。而且别这样,你让我对iPad产生了嫉妒。现在还太早了,先别提这些。 - duffymo
我取消了公开的尴尬,我感觉不好意思 :) - Pascal Thivent
放心吧 - 这是它能够坚持下去的唯一方式。 - duffymo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接