微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尽管拥有良好的@Query,变量未更新

如何解决尽管拥有良好的@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

我做错了什么?我真的很困惑。

enter image description here

解决方法

使用JPQL进行更新时,更新将直接发送到数据库。 Hibernate不会神奇地更新持久性上下文(一级缓存)中的相应实体。

userRepository.findUserByUsername(username)应该从数据库中获取用户(不使用缓存)。但是,如果启用了query cache,则可以从缓存中加载结果。您需要启用SQL日志记录并为此检查日志。

还要记住,@Transactional上方的blockUser()不会执行任何操作,因为spring boot为每个测试方法创建了一个事务。当然,这并不意味着您必须删除@Transactional

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。