AFAIK @Modifying在@Query注释中指定的INSERT/UPDATE/DELETE查询情况下负责持久性上下文清理。
但是纯@Modifying有什么好处呢?根据这个职位的说法,似乎你应该总是写@Modifying(clearAutomatically=true, flushAutomatically=true)。
文档显示(链接):
由于EntityManager在执行修改查询后可能包含过时的实体,所以我们不会自动清除它.因为这有效地降低了EntityManager中所有尚未执行的非刷新更改。
因此,默认情况下,@Modifying不清洗(和不要冲水)。那么我为什么要将它添加到我的@Query方法中呢?
发布于 2021-01-15 15:51:10
@修改注释用于增强@Query注释,不仅执行SELECT查询,而且还插入、更新、删除甚至DDL查询。
让我们玩一下这个注释,看看它是由什么组成的。
首先,让我们看一个@修改更新查询的示例:
@Modifying
@Query("update User u set u.active = false where u.lastLoginDate < :date")
void deactivateUsersNotLoggedInSince(@Param("date") LocalDate date);让我们尝试另一个删除已停用用户的方法:
@Modifying
@Query("delete User u where u.active = false")
int deleteDeactivatedUsers();正如我们所看到的,这个方法返回一个整数。这是Spring @修改查询的一个特性,它为我们提供了更新实体的数量。
我们应该注意,使用@Query执行delete查询与Spring的deleteBy名称派生查询方法不同。后者首先从数据库中获取实体,然后逐个删除它们。因此,这意味着将对这些实体调用生命周期方法@PreRemove。但是,对于前者,对数据库执行一个查询。
最后,让我们使用DDL查询将一个已删除的列添加到USERS表中:
@Modifying
@Query(value = "alter table USERS.USERS add column deleted int(1) not null default 0", nativeQuery = true)
void addDeletedColumn();不幸的是,使用修改查询会使底层持久性上下文过时。然而,管理这种情况是可能的。
发布于 2021-01-15 14:18:46
(clearAutomatically=true,flushAutomatically=true)将添加它们,以便使用clearAutomatically和flushAutomatically属性管理持久性上下文的状态。这将清除/刷新第一级缓存中的对象。
通过使用@Modify,spring引导应用程序为DB提供了执行这些操作的写权限(UPDATE/INSERT/DELETE)。@查询可以单独用于GET,并且必须对其他3种修改操作使用@modify来获得DB权限。
发布于 2021-01-15 15:15:47
对@Query的写操作是强制性的,这就是为什么。
clearAutomatically和flushAutomatically允许您决定是在后面清除,还是在冲洗之前清除。如果设置为false (默认值),那么Spring数据将在它认为合适的时候执行,试图优化对DB的访问操作。手术后可能不清楚,也可能在手术前冲洗,但它仍然会这样做。
https://stackoverflow.com/questions/65736766
复制相似问题