首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不指定其属性的情况下,Spring的@修改有什么用处吗?

在不指定其属性的情况下,Spring的@修改有什么用处吗?
EN

Stack Overflow用户
提问于 2021-01-15 13:15:12
回答 3查看 1.2K关注 0票数 0

AFAIK @Modifying@Query注释中指定的INSERT/UPDATE/DELETE查询情况下负责持久性上下文清理。

但是纯@Modifying有什么好处呢?根据这个职位的说法,似乎你应该总是写@Modifying(clearAutomatically=true, flushAutomatically=true)

文档显示(链接):

由于EntityManager在执行修改查询后可能包含过时的实体,所以我们不会自动清除它.因为这有效地降低了EntityManager中所有尚未执行的非刷新更改。

因此,默认情况下,@Modifying不清洗(和不要冲水)。那么我为什么要将它添加到我的@Query方法中呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-15 15:51:10

@修改注释用于增强@Query注释,不仅执行SELECT查询,而且还插入、更新、删除甚至DDL查询。

让我们玩一下这个注释,看看它是由什么组成的。

首先,让我们看一个@修改更新查询的示例:

代码语言:javascript
复制
@Modifying
@Query("update User u set u.active = false where u.lastLoginDate < :date")
void deactivateUsersNotLoggedInSince(@Param("date") LocalDate date);

让我们尝试另一个删除已停用用户的方法:

代码语言:javascript
复制
@Modifying
@Query("delete User u where u.active = false")
int deleteDeactivatedUsers();

正如我们所看到的,这个方法返回一个整数。这是Spring @修改查询的一个特性,它为我们提供了更新实体的数量。

我们应该注意,使用@Query执行delete查询与Spring的deleteBy名称派生查询方法不同。后者首先从数据库中获取实体,然后逐个删除它们。因此,这意味着将对这些实体调用生命周期方法@PreRemove。但是,对于前者,对数据库执行一个查询。

最后,让我们使用DDL查询将一个已删除的列添加到USERS表中:

代码语言:javascript
复制
@Modifying
@Query(value = "alter table USERS.USERS add column deleted int(1) not null default 0", nativeQuery = true)
void addDeletedColumn();

不幸的是,使用修改查询会使底层持久性上下文过时。然而,管理这种情况是可能的。

票数 1
EN

Stack Overflow用户

发布于 2021-01-15 14:18:46

(clearAutomatically=true,flushAutomatically=true)将添加它们,以便使用clearAutomatically和flushAutomatically属性管理持久性上下文的状态。这将清除/刷新第一级缓存中的对象。

通过使用@Modify,spring引导应用程序为DB提供了执行这些操作的写权限(UPDATE/INSERT/DELETE)。@查询可以单独用于GET,并且必须对其他3种修改操作使用@modify来获得DB权限。

票数 0
EN

Stack Overflow用户

发布于 2021-01-15 15:15:47

@Query的写操作是强制性的,这就是为什么。

clearAutomatically和flushAutomatically允许您决定是在后面清除,还是在冲洗之前清除。如果设置为false (默认值),那么Spring数据将在它认为合适的时候执行,试图优化对DB的访问操作。手术后可能不清楚,也可能在手术前冲洗,但它仍然会这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65736766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档