我什么时候需要在我的服务方法中明确求助于 EntityManager 方法(我对 clear()、close()、flush()、detach() 特别感兴趣,这些方法还可以与 Spring Data 存储库一起使用?
我最感兴趣的是对该主题的一般见解。 假设在一个应用程序中我发现了这个:
for ( MyEntity myEntity: entities) {
...some logic here
mySpringDataRepo.save ( myEntity );
}
entityManager.flush ();
entityManager.clear ();
我发现这样使用 EntityManager 是合理的,因为内存可能因实体而过载。 然而,在另一个代码片段中:
mySpringDataRepository.save(entity);
entityManager.detach(entity);
是否需要显式分离实体? Spring Data 不是自己处理吗?
我还找到了这篇文章: http://newscentral.exsees.com/item/de38b01b7a9f794a124e2c72b97d1103-c5533957a4140e3c51e7d295ec840d08
这让我更加困惑。
至于 close() 方法,我认为在 EE 环境中没有必要调用它。我说得对吗?
PS:我的配置很主流:JpaTransactionManager/LocalContainerEntityManagerFactoryBean
最佳答案
我认为存储库客户端应该永远、永远与比存储库本身更低层的 API 交互。与数据访问 API 交互是存储库应该抽象的内容。
如果你仔细想想,它会引发很多问题:
- 模拟存储库来测试服务已经不够了,您还必须模拟
EntityManager
。 - 为什么服务应该首先知道
EntityManager
? - 如果您决定切换到基于 JDBC 的存储库实现,该怎么办?您还必须触摸该服务的代码。
所以答案很简单:确定您的实际用例是什么。如果标准的 Spring Data 机制(查询方法、执行谓词)不允许开箱即用地建模,请添加自定义实现,例如描述 here并在存储库内部实现该功能。不,em.detach()
不是用例。
关于java - EntityManager 与 Spring Data 存储库的显式使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29622124/