gpt4 book ai didi

java - JpaRepository.save() 方法在内部是如何工作的

转载 作者:行者123 更新时间:2023-11-29 02:58:16 24 4
gpt4 key购买 nike

我有一个实体——工作流

@Entity
Workflow {
...
...
@OneToMany(mappedBy = "workflow", cascade = CascadeType.ALL)
List<Tasks> tasks
...
}

还有另一个任务实体

@Entity
Task {
...
Status status;
...
@ManyToOne
@JoinColumn(name = "workflow_id")
Workflow workflow
...
}

两个实体都定义了JpaRepository

WorkflowRepo extends JpaRepository<Workflow, Id>
TaskRepos extends JpaRepository<Task, Id>

现在,要更新 Task 的状态,哪种方法最有效?

workFlowRepo.save(workflow) // saving the whole workflow object which internally updates task also 

或者

tasRepo.save(task) // saves only task object in repo.

上述两种技术在性能上是否存在重大差异。

JpaRepoitory.save() 在这些条件下如何工作?它会在整个对象上运行更新语句还是只更新更改的对象?

最佳答案

由于您没有级联注释,因此您必须保存任务

如果您有适当的级联注释,性能差异取决于大量因素,例如实体的精确映射、实体的状态和底层 EntityManager 的状态。一般来说,与实际保存实体所需的不可避免的时间相比,它可以忽略不计。

关于save 的工作原理:

save 操作在底层 EntityManager 上执行merge。这本身不执行任何 SQL,而只是返回实体的托管版本。如果该实体尚未加载到 EntityManager 中,它可能会执行此操作,或者可能会将实体标识为新实体并使其成为托管实体。然后它可能必须执行插入语句或选择才能获取 ID。

如果保存不是作为上述的副作用发生的,它只会在 EntityManager flushed 时发生。这通常发生在事务结束时,但也可能发生在查询执行之前或明确要求时。

注意:看起来您想要双向关系,但实际上您有两个独立的关系。一个从 WorkflowTask,一个从 Task 返回到 Workflow

关于java - JpaRepository.save() 方法在内部是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59421466/

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