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

时间:2010-10-07 11:58:13

标签: spring jpa dao

我正在使用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 个答案:

答案 0 :(得分:6)

我说你的方法听起来很完美。就个人而言,我不使用JpaDaoSupportJpaTemplate,因为您可以使用EntityManager和条件查询执行所需的一切。

来自JavaDoc of JpaTemplate

的引用
  

JpaTemplate主要作为JdoTemplate和HibernateTemplate的兄弟存在,为习惯使用它的人提供相同的风格。对于新启动的项目,请考虑采用标准JPA样式的编码数据访问对象,基于通过Spring bean定义或JPA PersistenceContext注释注入的“共享EntityManager”引用。

答案 1 :(得分:4)

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

  • 它的侵入性较小,你没有将DAO绑定到Spring
  • 模板对使用未经检查的例外的API提供了很多价值

这是Spring的推荐,正如博客文章“So should you still use Spring's HibernateTemplate and/or JpaTemplate??”和官方javadoc所总结的那样:

  

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

     

(...)

     

所以简而言之(就像JavaDoc for   HibernateTemplate和   JpaTemplate已经提到了)   我建议你开始使用   Session和/或EntityManager API   直接,如果你开始使用   Hibernate或JPA分别上新的   project-remember:Spring试图成为   非侵入性,这是另一个伟大的   例如!

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

如果你正在使用JPA,你可以选择实现:Hibernate,TopLink等。

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

因此,如果你的目标是最大限度地提高可移植性,坚持使用JPA标准,而不是像Hibernate这样的特定实现,请确保你的DAO只使用JPA结构。