JPA vs Spring JdbcTemplate

对于一个新的项目来说,JPA总是处理关系数据的推荐工具,或者Spring JdbcTemplate是一个更好的select吗? 您的回复中需要考虑的一些因素:

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

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

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

这两种技术都需要开发人员知道关系数据库,SQL和事务。 使用JPA,您可以获得更多隐藏的复杂性。

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

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

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

我有点迟到这篇文章,但我倾向于使用ORM上的JdbcTemplate。 我知道SQL(很好),真的不想被“抽象”离开我的数据库。 我发现大多数情况下,我的应用程序正在使用数据库视图,将大多数业务逻辑推向最大。 我已经正确分层的DAO有JdbcTemplate实现。 它感觉“干净”,大多数样板代码被JdbcTemplate隐藏(而且它的联机文档似乎比ORM更好)。 我使用Hibernate的时间有限,我发现它的工作时间节省了一些时间,但是当它不能正常工作时,我需要花费几天的时间来进行“WTF”debugging。 我从来没有花费超过20分钟debuggingJdbcTemplate DAO impls。 正如其他人指出的那样,我认为关键在于SQL / Schema Design是多么舒服

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

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

正因为如此,ORM非常善于使您的生活轻松进行某些types的操作,即简单的CRUD操作。 你可以加载你的模型对象,呈现它们,更新它们,很容易删除它们。 它让你的生活更轻松,因为当你访问你的数据时,你会得到模型对象,你可以在其上编写业务逻辑。 如果你使用JDBC,你将不得不从数据中“水合”你的对象实例,这可能很复杂,容易出错。

ORM并不总是最好的select。 JPA是一个工作的工具,如果这个工具不够用,那么你会希望find一个更好的工具。 例如,我有一个场景,我必须复制整个对象图并保存这些对象的新副本。 如果我已经使用ORM(就像我试图做的那样),我不得不将所有的对象加载到数据库中,然后复制它们,然后保存新的对象。 我花了太长时间。

更好的解决scheme是简单地使用基于jdbc的操作,并通过select'插入sql调用来创build新的行。 它速度很快,代码更简单。

另一件要考虑的事情是,你对JDBC很熟悉,并有截止date,你不必跳上ORM的潮stream。 Spring的JdbcTemplate类非常强大和有用。 有时候,最好的工具是你所知道的。 你应该熟悉ORM,但不一定是对高期望的项目。 有很多东西需要学习,而且不是微不足道的 – 在使用jdbc和orm的select中,你真的正在交易另外一种复杂的东西。

在其他答案中没有提到,但是两者都可以使用。 在我的应用程序中,我使用JPA和JdbcTemplate,对于粗糙types的操作,我使用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.entityManager.queryForList("SELECT .. ",SomeProjectPojo.class); } } 

关于Spring的好处在于从JPAexception到Spring Daoexception层次结构的exception转换可以同时用于JPA和jdbcTemplate。 因此,在有意义时使用JPA,在有意义时使用jdbcTemplate。

在工作中,我们使用Hibernate JDBCTemplate,因为它具有更多的灵活性。 它也比JPA有更好的性能,因为你不会将大量不必要的数据“加载”到你的应用程序中。
在JDBCTemplate的情况下,你的SQL技能能够以正确的速度准确地给你所需要的东西。