我有一个简单的用户帐户应用程序,用户可以在其中更改其详细信息。
更新数据库
Managed Bean的方法,它接受表单参数并调用Service方法:
public String changeDetails(){
Date date = DateUtil.getDate(birthDate);
Integer id = getAuthUser().getId();
UserDetail newDetails = new UserDetail(id, occupation, date, originCity, residenceCity, description);
EntityTransaction transaction = getTransaction();
userService.updateDetail(newDetails);
transaction.commit();
return null;
}
服务方法:
public boolean updateDetail(UserDetail newDetails) {
boolean ok = true;
if (newDetails != null) {
UserDetail user = readDetail(newDetails.getId());
user.setOccupation(newDetails.getOccupation());
user.setOriginCity(newDetails.getOriginCity());
user.setResidenceCity(newDetails.getResidenceCity());
user.setBirth(newDetails.getBirth());
user.setDescription(newDetails.getDescription());
}
return ok;
}
从数据库中获取数据
@PostConstruct
public void init(){
userService = new UserService();
sessionController.setAuthUser(userService.read(getAuthUser().getId()));
originCity = getAuthUser().getUserDetail().getOriginCity();
residenceCity = getAuthUser().getUserDetail().getResidenceCity();
occupation = getAuthUser().getUserDetail().getOccupation();
birthDate = DateUtil.getStringDate(getAuthUser().getUserDetail().getBirth());
description = getAuthUser().getUserDetail().getDescription();
}
问题是这段代码的行为是不同的。有时我会获得所需的结果:一旦我提交新的详细信息并致电@PostConstruct init ()
,就会打印出新的详细信息。有时,即使更新了DB条目,也会打印旧的详细信息。
结论:有时候JPA会给我带来与DB中不同的结果。我猜这个结果包括来自Persistance Context的数据,这些数据没有更新。有没有一种方法可以确保JPA总是直接从数据库中提取数据?或者有什么我想念的东西?
答案 0 :(得分:1)
你的意思是有没有办法在操作之前关闭缓存或清空缓存?
emf.getCache().evictAll();
答案 1 :(得分:1)
如果您使用的是JPA 2,则实体定义中的@Cacheable(false)
应该每次都从数据库中读取。