如何解决尽管拥有良好的@Query,变量未更新
方法:
fun blockUser(username: String): Boolean {
val user = userRepository.findUserByUsername(username)
if (user == null) {
throw UsernameNotFoundException("User not found by username: $username")
} else {
userRepository.blockUser(username)
}
val justtocheckIfUserIsUpdated = userRepository.findUserByUsername(username) //to be removed
return true
}
@Modifying
@Transactional
@Query("update UserEntity c set c.isBlocked = TRUE WHERE c.username = :username")
fun blockUser(@Param("username") username: String)
测试:
@Test
fun `should block user when user exists`() {
//given
val userEntity = UserEntity(
username = "user",phoneNumber = "500200300",isBlocked = false,email = "kupaa@wp.pl"
)
val userService = UserService(userDetailsRepository,userRepository,passwordEncoder)
userRepository.save(userEntity);
//when
userService.blockUser(userEntity.username);
//then
val blockedUser = userRepository.findUserByUsername(userEntity.username);
assertthat(blockedUser!!.isBlocked).isTrue()
}
在调试时,您可以看到isblocked
始终为true,尽管我将其更新为true值。
测试结束:
Expected :true
Actual :false
我做错了什么?我真的很困惑。
解决方法
使用JPQL进行更新时,更新将直接发送到数据库。 Hibernate不会神奇地更新持久性上下文(一级缓存)中的相应实体。
此userRepository.findUserByUsername(username)
应该从数据库中获取用户(不使用缓存)。但是,如果启用了query cache
,则可以从缓存中加载结果。您需要启用SQL日志记录并为此检查日志。
还要记住,@Transactional
上方的blockUser()
不会执行任何操作,因为spring boot为每个测试方法创建了一个事务。当然,这并不意味着您必须删除@Transactional
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。