更新后,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;
}
我知道这很被看不起,但是我将其值放在 Javascript中。
像这样:
<c:set var="json" value="${json}"/>
var __data__ = ${json};
为什么在更新数据库时MVC无法显示正确的值?
我希望它在刷新时更新
编辑:我已禁用缓存,并且清除缓存仍然有问题。有什么帮助吗?
问题答案:
确定PersistenceContextType.EXTENDED
范围绝对是您问题的根本原因。原因如下:
通过PersistenceContextType.TRANSACTION
作用域,Spring框架负责管理注入的生命周期entitymanager
。TRANSACTION
作用域的寿命与基础transaction
关系密切,并且在事务的提交/回滚时,entityManager
将由spring框架关闭。
但是有了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) the
entityManager`检查其一级缓存,它将检查它在其中找到的(第一次加载的)一级缓存,并从其一级缓存(陈旧)返回此对象,而不是点击数据的数据库。
显然,有了TRANSACTION
范围,entityManager
只要事务完成(或方法退出),Spring框架就会关闭它。这样会entityManager
为每个请求(在您的情况下是Web请求)创建一个命中具有更新数据的数据库。
查看此链接是否有帮助。http://forum.spring.io/forum/other-spring-
related/ejb/18445-injection-of-persistencecontext-with-persistencecontexttype-
extended