Java JpaRepository.save()方法如何在内部工作

Java JpaRepository.save()方法如何在内部工作,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,我有一个实体-工作流 @实体 工作流程{ ... ... @OneToMany(mappedBy=“工作流”,cascade=CascadeType.ALL) 列出任务 ... } 和另一个具有 @实体 任务{ ... 地位; ... @许多酮 @JoinColumn(name=“工作流\u id”) 工作流 ... } 这两个实体都定义了JpaRepository WorkflowRepo extends JpaRepository<Workflow, Id> TaskRepo

我有一个实体-工作流

@实体
工作流程{
...
...
@OneToMany(mappedBy=“工作流”,cascade=CascadeType.ALL)
列出任务
...
}
和另一个具有

@实体
任务{
...
地位;
...
@许多酮
@JoinColumn(name=“工作流\u id”)
工作流
...
}
这两个实体都定义了
JpaRepository

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

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

i、 e.
JpaRepoitory.save()
在这些条件下如何工作?
它会在整个过程中运行update语句还是只更新已更改的对象?

因为没有级联注释,所以必须保存
任务

如果您有一个合适的级联注释,那么性能差异取决于很多事情,比如实体的精确映射、实体的状态以及底层
EntityManager
的状态。 一般来说,与实际保存实体所需的不可避免的时间相比,这是可以忽略的

关于
save
的工作原理:

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

如果保存不是上述操作的副作用,则只有在刷新
EntityManager
时才会发生。 这通常发生在事务结束时,但也可能发生在执行查询之前或显式请求查询时


注意:看起来你想要一个双向关系,但实际上你有两个独立的关系。一个是从
工作流
任务
,一个是从
任务
工作流

嗨,Jenes,这是任务的级联,我确实有双向关系,我在复制时错过了。SorryNow,因为我有级联和双向关系,哪种方法更新任务之一的状态将是有效的。保存整个工作流或仅保存该任务的状态。
workFlowRepo.save(workflow) // saving the whole workflow object which internally updates task also 
tasRepo.save(task) // saves only task object in repo.