在我的控制器中,将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在更新数据库时不会显示正确的值?
我希望它在刷新时更新
编辑:我已禁用缓存,清除缓存仍有问题。有什么帮助吗?
答案 0 :(得分:9)
确定PersistenceContextType.EXTENDED
范围是您确定问题的根本原因。原因如下:
使用PersistenceContextType.TRANSACTION
范围,Spring框架负责管理注入entitymanager
的生命周期。 TRANSACTION
范围的生命周期与基础transaction
相关联,并且在事务的提交/回滚时,entityManager
被spring框架关闭。
但是使用PersistenceContextType.EXTENDED
范围,Spring框架只负责注入entitymanager
。 EXTENDED
作用域实体管理器的生命周期与用户transaction
无关,它可以跨越多个事务。应用程序/用户可以在完成后明确关闭entityManager
。如果不是它将永远保持打开(或直到Spring容器关闭)。
我假设您userDAO
未明确关闭entityManager
。还有&#39; userDAO&#39;可能是一个单身人士。因此,只有一次注入的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请求)命中具有更新数据的数据库。
答案 1 :(得分:4)
所以我所拥有的解决方案与我发布的代码无关,而是在我的UserDAO.java类中。
简单的改变。
由此:
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
对此:
@PersistenceContext(type = PersistenceContextType.TRANSACTION)
private EntityManager em;
它有效。感谢评论并试图提供帮助的人/
编辑:我讨厌回答我自己的问题,所以如果有人能够深入解释为什么会这样做,我会接受它作为答案。
答案 2 :(得分:2)
http://docs.oracle.com/javaee/6/tutorial/doc/gkjio.html
禁用JPA二级缓存,否则实体管理器无法识别在数据库中直接更改的已更改数据 放
@Cacheable(false)
到您的实体