如何阻止 spring data JPA 在 save() 之前执行 SELECT?

新手上路,请多包涵

我们正在针对现有数据库编写一个新应用程序。我正在使用 Spring Data JPA,只是做了一个

MyRepository.save()

在我的新实体上,使用

MyRepository extends CrudRepository<MyThing, String>

我在日志中注意到 hibernate 在插入之前执行了 Select,并且它们花费了很长时间,即使在使用索引时也是如此。

我在这里搜索过这个, 我找到的答案 通常与 Hibernate 相关。我是 JPA 的新手,看起来 JPA 和 Hibernate 紧密地交织在一起,至少在 Spring Data 的上下文中使用它时是这样。链接的答案建议使用 Hibernate persist(),或者以某种方式使用可能来自 entityManager 的会话?我不必直接对会话或实体管理器或任何 Hibernate API 做任何事情。到目前为止,我已经在我的存储库中使用 save() 和几个 @Query 完成了简单的插入。

原文由 user26270 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
1 个回答

这是您使用 Spring Data 存储库使用的 Spring SimpleJpaRepository 的代码:

 @Transactional
public <S extends T> S save(S entity) {

    if (entityInformation.isNew(entity)) {
        em.persist(entity);
        return entity;
    } else {
        return em.merge(entity);
    }
}

它执行以下操作:

默认情况下,Spring Data JPA 检查给定实体的标识符属性。如果标识符属性为 null,则实体将被假定为新的,否则为非新的。

链接到 Spring Data 文档

因此,如果您的实体之一的 ID 字段不为空,Spring 将使 Hibernate 进行更新(因此之前进行 SELECT )。

您可以通过同一文档中列出的 2 种方式覆盖此行为。一种简单的方法是让您的实体实现持久化(而不是序列化),这将使您实现方法“isNew”。

原文由 Bertrand88 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题