gpt4 book ai didi

java - Spring Data JPA 何时实际调用数据库上的 INSERT?

转载 作者:搜寻专家 更新时间:2023-11-01 04:02:55 25 4
gpt4 key购买 nike

当您使用 JPARepository/Hibernate 保存一个对象时,它首先检查它是否存在于数据库中(使用主键),然后插入。所以我们看到 2 个日志:SELECT 和 INSERT。

这就是我试图通过 Spring 数据做的事情:(X 和 XY 是 2 个不同的对象)

Call Save on XRepository for Object X1

Call Save on XYRepository for Object X1Y1
Call Save on XYRepository for Object X1Y2
Call Save on XYRepository for Object X1Y3

Call Save on XRepository for Object X2

Call Save on XYRepository for Object X2Y1
Call Save on XYRepository for Object X2Y2
Call Save on XYRepository for Object X2Y3

这是我在日志中的观察:

SELECT X1
INSERT X1
SELECT X1Y1
SELECT X1Y2
SELECT X1Y3
INSERT X1Y1
INSERT X1Y2
INSERT X1Y3
SELECT X2
INSERT X2
SELECT X2Y1
SELECT X2Y2
SELECT X2Y3
INSERT X2Y1
INSERT X2Y2
INSERT X2Y3

那么Spring Data什么时候真正调用insert呢?这是如何工作的?

这是我所期望的:

SELECT X1
INSERT X1
SELECT X1Y1
INSERT X1Y1
SELECT X1Y2
INSERT X1Y2
SELECT X1Y3
INSERT X1Y3
...

最佳答案

Spring Data JPA本身并不直接控制与数据库的交互。它所做的只是与 EntityManager 交互,因此实际上所有行为效果都由 JPA 和底层 OR-mapper 定义。

持久性提供程序通常会尝试对数据库交互进行批处理,因为这样可以最大限度地减少开销,尤其是当您在单个 session 中执行大量持久性操作时。所以通常 EntityManager 只会在发生以下情况之一时将更改刷新到磁盘:

JPA 如何处理这个问题

  1. EntityManager(阅读:Hibernate 案例中的 Session)关闭,脏检查机制发现挂起的更改。因此,您可能已经使用 ….persist(…) 更改了附加实体的属性或将一个属性添加到持久性上下文。
  2. 要持久化的实体使用 ID 生成机制。
  3. 您手动调用 flush 方法。
  4. 您触发了一个查询并且 EntityManager 有未决的更改。然后它会将这些刷新到数据库以确保查询可能已经看到更改的数据。

As an aside: the last point sometimes results in the weird effect of DataIntegrityViolationExceptions being thrown when a query is executed and a lot of people don't get that in the first place. But it's the flushing of pending changes right before the query execution that causes the issue.

这导致了一些重要的观察结果:

Spring 数据细节

  1. 对于非 ID 自动生成的实体,不要期望它们在 EntityManager 关闭之前出现在数据库中。对于 Spring,这通常绑定(bind)到事务的生命周期,因此您可能需要先提交并检查已更改对象的更改属性。
  2. 您可以查询它并检查返回的对象,而不是直接检查对象。这使用了我在上面 4 中描述的内容。注意:不要将 findOne(…) 用于此方法,因为这将使用 EntityManager.find(type, id) 方法,该方法通常大量使用一级缓存(可能不先刷新)。
  3. 作为最后的手段,您可以在 JpaRepository 接口(interface)上使用 saveAndFlush(...),但我们强烈建议不要这样做,因为您可以有效向您的客户公开持久层内部结构。更喜欢使用自动 ID 生成的实体。

关于java - Spring Data JPA 何时实际调用数据库上的 INSERT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20630686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com