更新后,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 authorities = (Collection) 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; } 

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

像这样:

  var __data__ = ${json}; 

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

我希望它在刷新时更新

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

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

使用PersistenceContextType.TRANSACTION范围,Spring框架负责管理注入entitymanager管理器的生命周期。 TRANSACTION范围的生命周期与底层transaction并且在transaction的提交/回滚时, entityManager由spring框架关闭。

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

我假设你的userDAO没有显式关闭entityManager 。 而且’userDAO’可能是一个单身人士。 因此,在多个调用(或http请求)中使用仅注入一次的相同entityManager

这样, entityManager' remains open forever and so when you try to access any object (User/Plugin/UserDetails) the entityManager`会检查其第一级缓存,它将检查它在其中找到的第一级缓存(已加载为第一次)并将此对象从其第一级缓存(过时)返回,而不是为数据访问数据库。

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

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

所以我的解决方案与我发布的代码无关,而是在我的UserDAO.java类中。

简单的改变。

由此:

 @PersistenceContext(type = PersistenceContextType.EXTENDED) private EntityManager em; 

对此:

 @PersistenceContext(type = PersistenceContextType.TRANSACTION) private EntityManager em; 

它的工作原理。 感谢评论并试图帮助的人/

编辑:我讨厌回答我自己的问题,所以如果有人能够深入解释为什么这样做,我会接受它作为答案。

http://docs.oracle.com/javaee/6/tutorial/doc/gkjio.html

禁用JPA二级缓存,否则实体管理器无法识别在数据库Put中直接更改的已更改数据

 @Cacheable(false) 

到你的实体