JPA 中的哪些操作绕过持久性上下文/缓存并直接在数据库中调用?

Posted

技术标签:

【中文标题】JPA 中的哪些操作绕过持久性上下文/缓存并直接在数据库中调用?【英文标题】:What operations in JPA bypass Persistance context/Cache and directly invoke in database? 【发布时间】:2016-06-15 06:20:28 【问题描述】:

我指的是Pro JPA2学习JPA的书。它说查询,批量更新和批量删除绕过持久性上下文并在数据库中执行,是否意味着这些操作没有执行持久化上下文并直接在数据库中调用。 例如find 方法在持久化上下文中执行,但 select/update/delete 查询在 database 上执行。 find 可能会也可能不会命中数据库,但 SELECT/UPDATE/DELETE 会命中数据库。 请在此处为我提供更多见解

【问题讨论】:

【参考方案1】:

是不是说这些操作不是在持久化上下文中执行的,而是直接在数据库中调用的

JPA 2.0 Specification(参见下面的摘录)并未声明操作不会使用持久性上下文。但这些操作的结果不会反映在内存或缓存中的实体。

4.10 批量更新和删除操作

...

批量更新直接映射到数据库更新操作,绕过乐观锁定检查。如果需要,便携式应用程序必须手动更新版本列的值,和/或手动验证版本列的值。

持久化上下文与批量更新或删除的结果不同步。

在执行批量更新或删除操作时应该小心,因为它们可能会导致数据库和活动持久性上下文中的实体之间的不一致。一般来说,批量更新和删除操作只能在新的持久性上下文中的事务中执行,或者在获取或访问状态可能受此类操作影响的实体之前执行。

【讨论】:

我需要深入了解规格

以上是关于JPA 中的哪些操作绕过持久性上下文/缓存并直接在数据库中调用?的主要内容,如果未能解决你的问题,请参考以下文章

Jpa中的persist方法和merge方法都有哪些区别,帮我举一个例子解释下?

从 JPA/EJB3 持久性上下文中分离实体

执行此操作需要事务(使用事务或扩展持久性上下文)

为啥需要在执行修改查询之前清除 jpa 持久性上下文?

在jpa中将持久性上下文设置为只读

使用 JPA 和 JUnit 测试时如何一致地擦除内存数据库中的 H2 [重复]