Java 春季MVC赢得';t更新后显示正确的数据库值
在我的控制器中,将Java 春季MVC赢得';t更新后显示正确的数据库值,java,spring,spring-mvc,Java,Spring,Spring Mvc,在我的控制器中,将MySQL数据库中的值放入ModelAndView对象中 有一个单独的程序更新该表,MVC应该获取该值,因此没有表单更新该表 更新表格时,当我在浏览器上点击刷新时,页面上的值将不会更新 控制器 @SuppressWarnings("unchecked") @Secured({ "ROLE_USER", "ROLE_ADMIN" }) @RequestMapping(value = { "/", "/welcome" }, method = RequestMethod.GET)
MySQL
数据库中的值放入ModelAndView对象中
有一个单独的程序更新该表,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;
}
@SuppressWarnings(“未选中”)
@安全({“角色\用户”、“角色\管理员”})
@RequestMapping(值={”/“,“/welcome”},方法=RequestMethod.GET)
公共模型和视图默认页面(@modeldattribute(“用户”)用户){
收集权限=(收集)SecurityContextHolder
.getContext().getAuthentication().GetAuthories();
ModelAndView=newmodelandview(“/hello”);
//如果用户具有管理员角色,则重定向到管理员页面
if(authorities.toString()包含(“角色\管理员”)){
返回新的ModelAndView(“重定向:/admin”);
}
/////
Authentication auth=SecurityContextHolder.getContext().getAuthentication();
字符串userName=auth.getName();
User userInfo=userDAO.getUserInfo(用户名);
System.out.println(“这里是“+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);//这是未更新的值
String name=obj.getJSONObject(“meta”).getJSONObject(“locate”).getString(“value”);
System.out.println(名称);
view.addObject(“json”,obj);
返回视图;
}
我知道这很不受重视,但我把这个值放在了Javascript中。
像这样:
<c:set var="json" value="${json}"/>
var __data__ = ${json};
var_uuudata_uuu=${json};
为什么在更新数据库时MVC不能显示正确的值
我希望它在刷新时更新
编辑:我已禁用缓存并清除了缓存,但仍然存在问题。有什么帮助吗
因此,我的解决方案与我发布的代码无关,而是在我的UserDAO.java类中 简单的改变 由此:
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
为此:
@PersistenceContext(type = PersistenceContextType.TRANSACTION)
private EntityManager em;
它是有效的。感谢那些发表评论并试图提供帮助的人/
编辑:我讨厌回答我自己的问题,所以如果有人能深入解释为什么这样做,我会接受这个答案。肯定
PersistenceContextType。扩展的范围是您确定的问题的根本原因。原因如下:
使用PersistenceContextType.TRANSACTION
作用域,Spring框架负责管理entitymanager
中注入的事务的生命周期。事务
作用域的生命周期与底层的事务
相关联,事务提交/回滚后,entityManager
由spring框架关闭
但是对于PersistenceContextType.EXTENDED
范围,Spring框架只负责注入entitymanager
。EXTENDED
作用域实体管理器的生命周期不与用户事务关联,它可以跨越多个事务。一旦我们使用完entityManager
,应用程序/用户就可以显式关闭它。否则,它将永远保持打开状态(或直到弹簧容器关闭)
我假设在您的userDAO
中,您没有明确关闭entityManager
。而且“userDAO”也可以是一个单例。因此,在多个调用(或http请求)中使用了只注入一次的同一个entityManager
这样,entityManager'将永远保持打开状态,因此当您尝试访问任何对象(用户/插件/用户详细信息)时,
entityManager`将检查其第一级缓存,它将检查其在其中找到的第一级缓存(第一次加载),并从其第一级缓存返回此对象(已过时)而不是点击数据库获取数据
显然,对于TRANSACTION
范围,entityManager
在事务完成(或方法退出)时由Spring框架关闭。这将导致为每个请求(在您的web请求中)创建一个entityManager
,并访问包含更新数据的数据库
看看这个链接是否有用
禁用JPA二级缓存,否则实体管理器无法识别数据库中直接更改的更改数据
放
在您的实体上抱歉,不太清楚您所说的jsp重载是什么意思数据库前面的应用程序中是否有应用程序级缓存或二级缓存?@MadhusudanaReddySunnapu我不完全确定应用程序中是否有缓存,这可能是您没有看到更新值的原因。你可以检查一下。我不确定缓存是否有问题。我的意思是它可能是,但我清除了缓存并设置了标题,但它仍然没有显示正确的值。哦,这是很棒的东西。谢谢。我已经说过解决方案是什么,我还说禁用任何缓存都不起作用。
@Cacheable(false)