【问题标题】:JPA vs Spring JdbcTemplate [closed]JPA 与 Spring JdbcTemplate [关闭]
【发布时间】:2011-06-02 05:14:40
【问题描述】:

对于一个新项目,JPA 是否始终是处理关系数据的推荐工具,或者在某些情况下 Spring JdbcTemplate 是更好的选择?在您的回复中需要考虑的一些因素:

  • 新的数据库架构与预先存在的架构和表
  • 开发人员专业知识水平
  • 易于与数据缓存层集成
  • 性能
  • 还有其他需要考虑的相关因素吗?

【问题讨论】:

  • 您要考虑的另一个因素是标准化。

标签: java spring jpa jdbctemplate spring-jdbc


【解决方案1】:

如果您不想通过域模型访问数据库模式,请使用 Spring JdbcTemplate。使用 JdbcTemplate,您使用的是较低级别的访问,具有更大的灵活性,但也可能是更多样板。

Spring JdbcTemplate 可以更轻松地与异国情调的数据库模式和存储过程焦点一起使用。使用 JPA,您需要确保数据库模式正确映射到域模型。

这两种技术都需要开发人员了解关系数据库、SQL 和事务。但是,使用 JPA,您会获得更多隐藏的复杂性。

据我所知,JPA 更容易插入数据缓存层,因为面向对象的焦点使缓存条目识别、更新和失效更容易。

您可以更好地微调基于 JdbcTemplate 的后端,但在大多数情况下涉及更多代码。

需要考虑的其他方面是,尽管使用 JPA,您可以获得数据库模式的域模型,但您通常需要使用额外的 DTO 类。使用 JdbcTemplate 可以直接对 DTO 类进行操作。

【讨论】:

  • +1 关于需要了解关系数据库、sql 和事务的开发人员的优点。然而,JPA 将允许您将持久层视为由表支持的对象,而不仅仅是表。
  • @Timo 我试图从连接池的角度来理解这一点。那么 JPA 能否拥有像 HikarCP 这样具有连接池的数据源?还是 JPA 自己处理呢
【解决方案2】:

我写这篇文章有点晚了,但我倾向于使用 JdbcTemplate 而不是 ORM。我知道 SQL(非常好)并且真的不想从我的数据库中“抽象”出来。我发现大多数时候,我的应用程序都在使用数据库视图,我将大部分业务逻辑推送到这些视图中。我已经正确分层了具有 JdbcTemplate 实现的 DAO。感觉“干净”,大多数样板代码都被 JdbcTemplate 隐藏(而且它的在线文档似乎比 ORM 的东西好得多)。我使用 Hibernate 之类的东西的时间有限,我发现它什么时候可以工作,它节省了我一些时间……但是当它不能正常工作时,它花了我几天的“WTF”调试时间。我从来不需要花费超过 20 分钟来调试 JdbcTemplate DAO 实现。正如其他人所说,我认为关键是您对 SQL / Schema Design 的熟悉程度

【讨论】:

    【解决方案3】:

    我同意@Timo。我要添加/扩展的唯一其他见解是 ORM 具有与纯 sql 访问数据不同的语义。

    ORM 的目的是尽可能地抽象出您的数据在数据库中的事实。当您正确使用 ORM 时,所有持久性操作都在一个(希望如此)薄层中处理。您的模型对象将几乎没有持久性代码;您使用 ORM 的事实对您的模型应该是不可见的。

    正因为如此,ORM 非常擅长让某些类型的操作变得轻松,即简单的 CRUD 操作。你可以很容易地加载你的模型对象,展示它们,更新它们,删除它们。它使您的生活更轻松,因为当您访问数据时,您会返回模型对象,您可以在其上编写业务逻辑。如果您使用 JDBC,则必须从数据中“水合”您的对象实例,这可能很复杂且容易出错。

    ORM 并不总是最佳选择。 JPA 是一项工作的工具,如果该工具不足以完成这项工作,您将希望找到一个更好的工具。例如,我有一个场景,我必须复制整个对象图并保存这些对象的新副本。如果我使用了 ORM(就像我尝试做的那样),我必须从数据库中加载所有对象,然后复制它们,然后保存新对象。我花的时间太长了。

    更好的解决方案是简单地使用基于 jdbc 的操作和“通过选择插入”sql 调用来创建新行。它很快,代码更简单。

    要考虑的另一件事是您对 JDBC 很熟悉,并且有截止日期,您不必赶上 ORM 潮流。 Spring JdbcTemplate 类非常强大和有用。有时,最适合这项工作的工具就是您所知道的。您应该熟悉 ORM,但对于期望值很高的项目不一定要熟悉。有很多东西要学,而且不是微不足道的——实际上,在选择使用 jdbc 与 orm 时,您正在将一组复杂性与另一组复杂性进行交易。

    【讨论】:

    • +1 表示结束语句。一般来说,这是 jdbc 与 orm 之间的决定,而不是特定于 JPA 与 JdbcTemplate。
    • 内存足迹呢? JdbcTemplate 和 Spring-Data-Jpa 之间有什么大的区别吗? (我猜是休眠)
    【解决方案4】:

    其他答案中没有提到,但两者都可以使用。在我的应用程序中,我使用 JPA 和 JdbcTemplate,对于 crud 类型的操作,我使用 JPA,但对于报告或更容易的地方,我使用 jdbcTemplate。

    @Repository
    public class FooRepository
    {
        @PersistenceContext
        private EntityManager entityManager;
    
        @Autowired(required = true)
        private JdbcTemplate jdbcTemplate;
    
        public void saveFoo(Foo foo)
        {
             this.entityManager.persist(foo);
        }
    
        public List<SomeReportPojo> getSomeReport()
        {
             return this.jdbcTemplate.queryForList("SELECT .. ",SomeProjectPojo.class); 
        }
    }
    

    Spring 的伟大之处在于,从 JPA 异常到 Spring Dao 异常层次结构的异常转换适用于 JPA 和 jdbcTemplate。所以在有意义的时候使用 JPA,在有意义的时候使用 jdbcTemplate。

    【讨论】:

    • getSomeReport() 中的行应该是this.jdbcTemplate. ... 而不是this.entityManager. ... 吗?
    • 不使用 XML 只使用注解时如何声明 JdbcTemplate bean?它不是由 Spring 自动完成的:我得到 NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found
    【解决方案5】:

    在工作中我们使用 Hibernate JDBCTemplate,因为它具有更大的灵活性。它还具有比 JPA 更好的性能,因为您不会将大量不必要的数据“加载”到您的应用程序中。
    在 JDBCTemplate 案例中,您的 SQL 技能可以帮助您以合适的速度准确地满足您的需求。

    【讨论】:

    • 美好的一天,你能澄清一下'hibernate jdbctemplate'是什么意思吗? Hibernate 和 Spring JDBCTemplate 的结合还是别的什么?
    猜你喜欢
    • 2019-07-14
    • 2017-02-24
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 2018-09-30
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多