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

发布于 2024-09-26 23:16:52 字数 540 浏览 2 评论 0原文

我正在使用 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 的示例。您更喜欢哪种设计?我的例子有什么问题吗?

I'm developing my first app with JPA/Hibernate and Spring. My first attempt at a DAO class looks like this:

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

I also found some examples using JpaDaoSupport and JpaTemplate. Which design do you prefer? Is there anything wrong with my example?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

り繁华旳梦境 2024-10-03 23:16:52

我想说你的方法看起来完全正确。就我个人而言,我不使用JpaDaoSupportJpaTemplate,因为您可以使用EntityManager和Criteria Queries完成您需要的一切。

引用自 JavaDoc Jpa模板

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

I'd say your approach looks totally sound. Personally I don't use JpaDaoSupport or JpaTemplate because you can do everything you need with the EntityManager and Criteria Queries.

Quote from the JavaDoc of JpaTemplate:

JpaTemplate mainly exists as a sibling of JdoTemplate and HibernateTemplate, offering the same style for people used to it. For newly started projects, consider adopting the standard JPA style of coding data access objects instead, based on a "shared EntityManager" reference injected via a Spring bean definition or the JPA PersistenceContext annotation.

九厘米的零° 2024-10-03 23:16:52

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

  • 它的侵入性较小,您不会将 DAO 绑定到 Spring
  • 模板,对于使用未经检查的异常的 API 不会提供太多价值

,这是 Spring 的建议,如博客文章“所以你还应该使用Spring的HibernateTemplate和/或JpaTemplate吗??”和官方javadoc:

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

(...)

简而言之(如 JavaDoc
HibernateTemplate
JpaTemplate 已经提到)
我建议您开始使用
Session 和/或 EntityManager API
如果您开始使用,请直接
分别新建Hibernate或JPA
项目——记住:Spring 试图成为
非侵入性,这是另一个伟大的
示例!

I prefer the template-less approach (i.e. your current approach) because

  • it's less invasive, you don't tie DAOs to Spring
  • templates don't offer much value with APIs that use unchecked exceptions

And this is the Spring recommendation, as summarized in the blog post "So should you still use Spring's HibernateTemplate and/or JpaTemplate??" and the official javadoc:

The real question is: which approach to choose??

(...)

So in short (as the JavaDoc for
HibernateTemplate and
JpaTemplate already mention)
I'd recommend you to start using the
Session and/or EntityManager API
directly if you're starting to use
Hibernate or JPA respectively on a new
project–remember: Spring tries to be
non-invasive, this is another great
example!

此刻的回忆 2024-10-03 23:16:52

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

I, personally, prefer your approach - inject EntityManager and use it directly. But JpaTemplate is also a good option. I don't like it, because adds yet another, unnecessary layer of abstraction.

懒猫 2024-10-03 23:16:52

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

如果您使用 JPA,则可以选择以下实现:Hibernate、TopLink 等。

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

因此,如果您的目标是最大限度地提高可移植性,坚持 JPA 标准,而不是将自己束缚于 Hibernate 等特定实现,请确保您的 DAO 仅使用 JPA 构造。

I don't know if there's a "standard" approach.

If you're using JPA, you have your choice of implementations: Hibernate, TopLink, etc.

If you deploy to Google App Engine, you'll use JPA talking to BigTable.

So if your objectives are to maximize portability, stick with the JPA standard, and not tie yourself to a particular implementation like Hibernate, make sure that your DAOs only use JPA constructs.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文