Spring实体管理器和Spring数据仓库之间有什么区别?

61

我在网站中使用JPA。在探索保存数据的选项后,我找到了两种方法。第一种方法是使用javax.persistence.EntityManager的实现。我使用LocalContainerEntityManagerFactoryBean来实例化一个EntityManager的实例。一旦我获得了一个EntityManager实例,我就可以使用它来保存实体。例如,

entityManager.merge(someEntity);

另一个选项是使用org.springframework.data.repository.CrudRepository的实例。一旦我获得了CrudRepository的实例,我可以使用它来保存实体。例如,

aCrudRepository.save(someEntity);

使用EntityManager和CrudRepository将实体持久化到数据库中有什么区别?这两种方法(entity manager vs. crud repository)的优缺点是什么?

2个回答

54

在Java/Spring中,处理持久数据有几个层次:

  • JDBC
  • JdbcTemplate
  • JPA(包含EntityManager
  • Spring Data JPA(包含Repository

每个抽象层都为开发人员屏蔽了低级细节,但也可能带来自己的复杂性。JdbcTemplate是基于纯JDBC的轻量级抽象,Repository是对EntityManager的抽象。它为开发人员屏蔽了一些EntityManager引入的复杂细节,并添加了样板代码和许多方便的方法。

例如,CrudRepository添加了findAll()的实现,这个方法非常常见,预定义它是有意义的。Repository有许多方便的方法,可以从方法名生成查询(约定大于配置),从实体本身生成查询(按示例查询)。它们允许使用漂亮的类型安全的Fluent API与Query DSL,或者启用动态投影。


1
所以如果您使用的是CrudRepository,您实际上并不需要EntityManager。 - user592748
如果你需要做一些特定的事情,而使用存储库方法很难实现,那么你可以这样做。例如,在上下文中分离和重新连接。 - Toni Nagy

32

这两个接口提供了两种不同的方法:

  • org.springframework.data.repository.CrudRepository 是提供 CRUD 操作的常见存储库接口。
  • javax.persistence.EntityManager 与持久性上下文相关。Spring 有自己的接口,它扩展了 CrudRepository,称为JpaRepository用于此目的。

我希望您了解持久化 API 的优点或缺点。如果您不知道,可以阅读 这个问题的答案


2
谢谢。从这个答案中,我了解到使用实体管理器或仓库保存实体没有区别。 - zfranciscus

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