java - EntityManager 与 Spring Data 存储库的显式使用

标签 java spring spring-data spring-data-jpa

我什么时候需要在我的服务方法中明确求助于 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/

相关文章:

java - 有没有办法重用 WebService ? Java 中的 Spring

java - 改变Spring数据jpa实体包创建bean报错

java - GWT:如果未登录应用程序,静态 HTML 页面应重定向到 login.html

java - IP 地址上的 UnknownHostException

spring - 向 ModelAndView 添加属性

Spring Jpa 将自定义功能添加到所有存储库,同时将其他自定义功能添加到单个存储库

java - 在实体中声明集合类型列时,差异实例或无

java - 关闭套接字和 ObjectOutputStream 的正确方法?

java - 使用 Hibernate Session 的最简单方法

java - Spring 数据 : multiple repository interfaces into a single 'repository' service class