Spring Entity Manager 和 Spring Data Repository 有啥区别?

Posted

技术标签:

【中文标题】Spring Entity Manager 和 Spring Data Repository 有啥区别?【英文标题】:What is the difference between an Spring Entity Manager and Spring Data Repository?Spring Entity Manager 和 Spring Data Repository 有什么区别? 【发布时间】:2013-01-15 07:13:52 【问题描述】:

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

entityManager.merge(someEntity);

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

aCrudRepository.save(someEntity);

使用 EntityManager 和 CrudRepository 将实体持久保存到数据库有什么区别?这两种方法(实体管理器与 crud 存储库)的优缺点是什么?

【问题讨论】:

【参考方案1】:

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

JDBC Jdbc模板 JPA(包含EntityManager) Spring Data JPA(包含Repository

每个抽象都使开发人员免受较低级别的细节的影响,但它可以 带来自己的复杂性。 JdbcTemplate 是对普通 JDBC 的精简抽象。 Repository 是对 EntityManager 的抽象。它使开发人员免受 EntityManager 引入的一些复杂细节,并添加了样板代码和许多方便的方法。

例如,CrudRepository 添加了findAll() 的实现,这很常见,因此预定义它是有意义的。存储库有许多方便的方法,用于从方法名称(约定优于配置)、实体本身(按示例查询)生成查询。它们允许将漂亮的类型安全 Fluent API 与 Query DSL 一起使用,或者启用动态投影。

【讨论】:

所以你真的不需要 EntityManager,如果你正在使用,例如,CrudRepository【参考方案2】:

这两个接口呈现了两种不同的方法:

org.springframework.data.repository.CrudRepository 是提供 CRUD 操作的存储库的通用接口。 javax.persistence.EntityManager 与持久性相关联 语境。 Spring有自己的接口,扩展CrudRepository 为此目的称为JpaRepository

我希望您了解持久 API 的优点或缺点。如果你不这样做,你可以阅读this question的答案。

【讨论】:

谢谢。从这个答案中,我认为使用实体管理器或存储库保存实体没有区别。

以上是关于Spring Entity Manager 和 Spring Data Repository 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

何时使用 Spring JPA (Hibernate) Entity Manager 将连接返回到连接池?

Symfony3:在服务中注入几个@ doctrine.orm.entity_manager

Spring框架学习综合案例 巩固

Spring - 从工厂类注入 bean

AWS Secrets Manager 和 Spring Boot

Spring整合JPA时,为实体类添加@Entity注解时提示The type MultipartEntity is deprecated