显式使用EntityManager和Spring Data存储库

时间:2015-04-14 08:03:53

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

我什么时候需要明确地使用EntityManager方法(我对我的Service方法中的clear(),close(),flush(),detach()特别感兴趣,这些方法还可以使用Spring Data repos?

我最感兴趣的是对该主题的一般见解。 让我们在一个应用程序中说我发现了这个:

    for ( MyEntity myEntity: entities) {
        ...some logic here
        mySpringDataRepo.save ( myEntity );
    }
    entityManager.flush ();
    entityManager.clear ();

我发现EntityManager的这种使用是合理的,因为内存可以用实体重载。 但是,在另一个代码段中:

    mySpringDataRepository.save(entity);
    entityManager.detach(entity);

是否有必要明确分离实体? Spring Data是否自行处理它?<​​/ p>

我也发现这篇文章: http://newscentral.exsees.com/item/de38b01b7a9f794a124e2c72b97d1103-c5533957a4140e3c51e7d295ec840d08

让我更加困惑。

对于close()方法,我认为没有必要在EE环境中调用它。我是对的吗?

PS:我的配置非常主流:JpaTransactionManager / LocalContainerEntityManagerFactoryBean

2 个答案:

答案 0 :(得分:5)

我认为存储库客户端永远不会与低层API进行交互而不是存储库本身。与数据访问API交互是存储库应该抽象的内容。

如果你考虑一下,就会引发很多问题:

  • 模拟存储库来测试服务是不够的,你还必须嘲笑EntityManager
  • 为什么服务应该首先了解EntityManager
  • 什么,如果您决定切换到基于JDBC的存储库实现?您也必须触摸服务代码。

所以答案很简单:确定你的实际用例是什么。如果标准的Spring数据机制(查询方法,执行谓词)不允许对开箱即用的模型进行建模,请添加自定义实现,例如:描述了here并在内部实现了功能。不,em.detach() 是一个用例。

答案 1 :(得分:1)

您不必担心实体经理。如果要手动刷新调用存储库中的flush方法,或者如果逐个保存实体则saveAndFlush。我个人并不打扰,我的存储库方法调用来自事务服务,当该方法执行时,提交最终会执行刷新。

顺便说一下,您不需要遍历集合来保存每个实体。只需对集合进行保存即可。