阿法伊克 @Modifying
在中指定的insert/update/delete查询的情况下,是否需要进行持久性上下文清理 @Query
注解。
但什么是纯洁的 @Modifying
有什么用?根据这篇文章,似乎你应该一直写 @Modifying(clearAutomatically=true, flushAutomatically=true)
.
文件上说(链接):
由于entitymanager在执行修改查询后可能包含过期的实体,因此我们不会自动清除它。。。因为这有效地删除了entitymanager中仍然挂起的所有未刷新的更改
所以默认情况下 @Modifying
不要清洗(也不要冲洗)。那我为什么要把它加到我的 @Query
方法?
3条答案
按热度按时间kmbjn2e31#
@modifying注解用于增强@query注解,使其不仅可以执行select查询,还可以执行insert、update、delete甚至ddl查询。
让我们玩一下这个注解,看看它是由什么组成的。
首先,我们来看一个@modifying update查询的示例:
让我们尝试另一个删除停用用户的方法:
我们可以看到,这个方法返回一个整数。这是springdatajpa@修改查询的一个特性,它为我们提供了更新实体的数量。
我们应该注意,使用@query执行delete查询的工作方式与springdatajpa的deletebyname派生查询方法不同。后者首先从数据库中提取实体,然后逐个删除它们。因此,这意味着将对这些实体调用lifecycle方法@preremove。但是,对于前者,只对数据库执行一个查询。
最后,让我们使用ddl查询向users表添加一个已删除的列:
不幸的是,使用修改查询会使底层持久性上下文过时。然而,这是可能的管理这种情况。
xienkqul2#
(clearautomatically=true,flushautomatically=true)它们将被添加以使用clearautomatically和flushautomatically属性管理持久性上下文的状态。这将清除/刷新一级缓存中的对象。
通过使用@modify,springboot应用程序向db授予执行这些操作(update/insert/delete)的写权限@query可以单独用于get,并且必须使用@modify for other 3 modify操作才能获得db权限。
9jyewag03#
对上的写操作是必需的
@Query
s、 这就是为什么。clearautomatically和flushautomatically允许您分别决定是否在之后立即清除和在之前立即清除。如果设置为false(默认值),那么spring data将在它认为合适的时候执行它,尝试优化对db的访问操作。手术后可能不清楚,或冲洗前可能不清楚,但它仍会这样做。