更新后,Spring MVC将无法显示正确的数据库值

bma*_*ham 11 java spring spring-mvc

在我的控制器中,将MySQL数据库中的值放入ModelAndView object

有一个单独的程序更新表,MVC应该获取该值,因此没有表单来更新该表.

表被更新,而当我打刷新浏览器,该值将不会在页面上更新.

调节器

@SuppressWarnings("unchecked")
@Secured({ "ROLE_USER", "ROLE_ADMIN" })
@RequestMapping(value = { "/", "/welcome" }, method = RequestMethod.GET)
public ModelAndView defaultPage(@ModelAttribute("user") User user) {
    Collection<SimpleGrantedAuthority> authorities = (Collection<SimpleGrantedAuthority>) SecurityContextHolder
            .getContext().getAuthentication().getAuthorities();
    ModelAndView view = new ModelAndView("/hello");
    // Redirects to admin page if user has admin role
    if (authorities.toString().contains("ROLE_ADMIN")) {
        return new ModelAndView("redirect:/admin");
    }
    /////
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    String userName = auth.getName();
    User userInfo = userDAO.getUserInfo(userName);
    System.out.println("Here's the thing " + userInfo.getLastname() + " " + userInfo.getUserDetails());
    Details details = userDAO.getDetailsInfo(userInfo.getUserDetails().getLastname(),
            userInfo.getUserDetails().getPostcode());
    Plugs plugs = userDAO.getPlugInfo(details.getMacAddress()); 
    String json = plugs.getJson();
    JSONObject obj = new JSONObject(json); //this is the value that is not updating
    String name = obj.getJSONObject("meta").getJSONObject("locate").getString("value");
    System.out.println(name); 
    view.addObject("json", obj);
    return view;
}
Run Code Online (Sandbox Code Playgroud)

我知道这很受鄙视,但我把这个值放在Javascript中.

像这样:

<c:set var="json" value="${json}"/> 

var __data__ = ${json};
Run Code Online (Sandbox Code Playgroud)

为什么MVC在更新数据库时不会显示正确的值?

我希望它在刷新时更新

编辑:我已禁用缓存和清除缓存仍有问题.有帮助吗?

Mad*_*apu 9

绝对PersistenceContextType.EXTENDED范围是您确定问题的根本原因.原因如下:

有了PersistenceContextType.TRANSACTION范围,Spring框架负责管理注入的生命周期entitymanager.TRANSACTION范围的生命周期与Spring的框架关闭transaction的事务的底层和提交/回滚相关联entityManager.

但是对于PersistenceContextType.EXTENDED范围,Spring框架只负责注入entitymanager.EXTENDED范围实体管理器的生命周期与用户无关transaction,它可以跨越多个事务.应用程序/用户可以entityManager在完成后立即关闭它.如果不是它将永远保持打开(或直到Spring容器关闭).

我认为userDAO你没有entityManager明确地结束.'userDAO'也可能是单身人士.所以entityManager只注入一次就是在多个调用(或http请求)中使用

通过这个,entityManager' remains open forever and so when you try to access any object (User/Plugin/UserDetails) theentityManager`检查它的第一级缓存,它将检查它在其中找到的第一级缓存(第一次加载),并将该对象从其第一级缓存(过时)返回而不是命中数据库.

显然,对于TRANSACTION范围,entityManager只要事务完成(或方法退出),Spring框架就会关闭它.这导致entityManager为每个请求创建一个(在您的情况下是Web请求)命中具有更新数据的数据库.

看看这个链接是否有帮助.http://forum.spring.io/forum/other-spring-related/ejb/18445-injection-of-persistencecontext-with-persistencecontexttype-extended