java—SpringDataJPA的@modifying在没有指定属性的情况下有什么用处吗?

eiee3dmh  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(415)

阿法伊克 @Modifying 在中指定的insert/update/delete查询的情况下,是否需要进行持久性上下文清理 @Query 注解。
但什么是纯洁的 @Modifying 有什么用?根据这篇文章,似乎你应该一直写 @Modifying(clearAutomatically=true, flushAutomatically=true) .
文件上说(链接):
由于entitymanager在执行修改查询后可能包含过期的实体,因此我们不会自动清除它。。。因为这有效地删除了entitymanager中仍然挂起的所有未刷新的更改
所以默认情况下 @Modifying 不要清洗(也不要冲洗)。那我为什么要把它加到我的 @Query 方法?

kmbjn2e3

kmbjn2e31#

@modifying注解用于增强@query注解,使其不仅可以执行select查询,还可以执行insert、update、delete甚至ddl查询。
让我们玩一下这个注解,看看它是由什么组成的。
首先,我们来看一个@modifying update查询的示例:

@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();

我们可以看到,这个方法返回一个整数。这是springdatajpa@修改查询的一个特性,它为我们提供了更新实体的数量。
我们应该注意,使用@query执行delete查询的工作方式与springdatajpa的deletebyname派生查询方法不同。后者首先从数据库中提取实体,然后逐个删除它们。因此,这意味着将对这些实体调用lifecycle方法@preremove。但是,对于前者,只对数据库执行一个查询。
最后,让我们使用ddl查询向users表添加一个已删除的列:

@Modifying
@Query(value = "alter table USERS.USERS add column deleted int(1) not null default 0", nativeQuery = true)
void addDeletedColumn();

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

xienkqul

xienkqul2#

(clearautomatically=true,flushautomatically=true)它们将被添加以使用clearautomatically和flushautomatically属性管理持久性上下文的状态。这将清除/刷新一级缓存中的对象。
通过使用@modify,springboot应用程序向db授予执行这些操作(update/insert/delete)的写权限@query可以单独用于get,并且必须使用@modify for other 3 modify操作才能获得db权限。

9jyewag0

9jyewag03#

对上的写操作是必需的 @Query s、 这就是为什么。
clearautomatically和flushautomatically允许您分别决定是否在之后立即清除和在之前立即清除。如果设置为false(默认值),那么spring data将在它认为合适的时候执行它,尝试优化对db的访问操作。手术后可能不清楚,或冲洗前可能不清楚,但它仍会这样做。

相关问题