【问题标题】:SpringJPAData: data not refreshed after updateSpringJPAData:更新后数据未刷新
【发布时间】:2016-02-25 22:23:25
【问题描述】:

我正在使用 UserRepository 中的@Query 更新 LOGIN 对象中的字段,然后立即进行查找以选择登录对象,数据未刷新。我确实在数据库中看到了更新的记录。如果我反弹我的 tomcat 服务器,转到浏览器上的页面,我将看到刷新的数据。 如下图,我将LOGIN.enabled更新为1(updateUserLoginEnableByUuid())然后调用findByLoginLoginEmail(),LOGIN.enable仍然显示为0。 似乎旧记录仍然缓存在某个地方,我错过了什么?

在 UserConroller.java 中:

@RequestMapping(value = "/user/enableUser/{userUuid}", method = RequestMethod.GET)
public String enableUser(Model aaModel, @PathVariable("userUuid") String userUuid, Principal aaPrincipal, SessionStatus aaStatus) {

    this.caService.updateUserLoginEnableByUuid(userUuid, (byte) 1);

    aaStatus.setComplete();

    return "redirect:/login";
}

在 userRepository.java 中,

    @Modifying // Indicates a method should be regarded as modifying query.
    @Query("update Login l SET l.enabled = :enabled WHERE l.user.uuid = :uuid")
    int updateUserLoginEnableByUuid(@Param("uuid") String uuid, @Param("enabled") byte enabled);

User findByLoginLoginEmail(String loginEmail);

【问题讨论】:

  • 数据没有刷新——哪里没有刷新?
  • 我将 LOGIN.enabled 更新为 1 (updateUserLoginEnableByUuid()) 然后调用 findByLoginLoginEmail(),LOGIN.enable 仍然显示为 0。
  • 所以在 enableuser 上做一个 GET,然后在重定向之后,大概是当用户尝试登录时,登录失败?如果开启show SQL,什么时候发送SQL?何时提交数据?

标签: spring-mvc jpa spring-security spring-data-jpa


【解决方案1】:

当您执行 DML 或 SQL 查询时,这会完全绕过实体管理器缓存(如您的示例中所示)。在这种情况下,由于查询,缓存所持有的状态并不能反映数据库中的内容

要实现更新,您需要在执行更新查询后清除实体管理器缓存以反映数据库中的这些更改。

可以@PersistenceContext private EntityManager em;访问entitymanager,更新查询后执行em.clear();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    相关资源
    最近更新 更多