显式使用 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() 不是 不是 用例。