显式使用 EntityManager 和 Spring 个数据存储库
Explicit use of EntityManager with Spring Data repositories
我什么时候需要在我的服务方法中显式地求助于 EntityManager 方法(我对 clear()、close()、flush()、detach() 特别感兴趣,这些方法还可以与 Spring 数据回购?
我最感兴趣的是对该主题的一般了解。
假设在一个应用程序中我发现了这个:
for ( MyEntity myEntity: entities) {
...some logic here
mySpringDataRepo.save ( myEntity );
}
entityManager.flush ();
entityManager.clear ();
我发现这样使用 EntityManager 是合理的,因为内存可能因实体而过载。
然而,在另一个代码片段中:
mySpringDataRepository.save(entity);
entityManager.detach(entity);
是否需要显式分离实体? Spring数据不自己处理吗?
我也发现了这个post:
http://newscentral.exsees.com/item/de38b01b7a9f794a124e2c72b97d1103-c5533957a4140e3c51e7d295ec840d08
这让我更加困惑。
至于close() 方法,我认为在EE 环境中没有必要调用它。我说得对吗?
PS:我的配置很主流:JpaTransactionManager/LocalContainerEntityManagerFactoryBean
您无需担心实体管理器。如果你想手动刷新存储库上的 flush 方法,或者如果一个一个地保存实体,则调用 saveAndFlush 。就我个人而言,我不介意,我的存储库方法调用来自事务服务,当该方法执行时,提交最终会刷新。
顺便说一下,您不需要循环遍历 collection 来保存每个实体。只需保存 collection.
我认为存储库客户端应该永远不会与比存储库本身更低的层API交互。与数据访问交互 APIs 是存储库应该抽象的内容。
仔细一想,问题很多:
- 模拟存储库来测试服务已经不够了,您还必须模拟
EntityManager
。
- 为什么服务应该首先知道
EntityManager
?
- 如果您决定切换到基于 JDBC 的存储库实现,该怎么办?您还必须触摸该服务的代码。
所以答案很简单:确定您的实际用例是什么。如果标准 Spring 数据机制(查询方法、执行谓词)不允许开箱即用地建模,请添加自定义实现,例如描述了 here 并在存储库 中 实现了该功能。不,em.detach()
不是 不是 用例。
我什么时候需要在我的服务方法中显式地求助于 EntityManager 方法(我对 clear()、close()、flush()、detach() 特别感兴趣,这些方法还可以与 Spring 数据回购?
我最感兴趣的是对该主题的一般了解。 假设在一个应用程序中我发现了这个:
for ( MyEntity myEntity: entities) {
...some logic here
mySpringDataRepo.save ( myEntity );
}
entityManager.flush ();
entityManager.clear ();
我发现这样使用 EntityManager 是合理的,因为内存可能因实体而过载。 然而,在另一个代码片段中:
mySpringDataRepository.save(entity);
entityManager.detach(entity);
是否需要显式分离实体? Spring数据不自己处理吗?
我也发现了这个post: http://newscentral.exsees.com/item/de38b01b7a9f794a124e2c72b97d1103-c5533957a4140e3c51e7d295ec840d08
这让我更加困惑。
至于close() 方法,我认为在EE 环境中没有必要调用它。我说得对吗?
PS:我的配置很主流:JpaTransactionManager/LocalContainerEntityManagerFactoryBean
您无需担心实体管理器。如果你想手动刷新存储库上的 flush 方法,或者如果一个一个地保存实体,则调用 saveAndFlush 。就我个人而言,我不介意,我的存储库方法调用来自事务服务,当该方法执行时,提交最终会刷新。
顺便说一下,您不需要循环遍历 collection 来保存每个实体。只需保存 collection.
我认为存储库客户端应该永远不会与比存储库本身更低的层API交互。与数据访问交互 APIs 是存储库应该抽象的内容。
仔细一想,问题很多:
- 模拟存储库来测试服务已经不够了,您还必须模拟
EntityManager
。 - 为什么服务应该首先知道
EntityManager
? - 如果您决定切换到基于 JDBC 的存储库实现,该怎么办?您还必须触摸该服务的代码。
所以答案很简单:确定您的实际用例是什么。如果标准 Spring 数据机制(查询方法、执行谓词)不允许开箱即用地建模,请添加自定义实现,例如描述了 here 并在存储库 中 实现了该功能。不,em.detach()
不是 不是 用例。