Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:从DB而不是持久性上下文获取数据_Java_Jpa - Fatal编程技术网

Java JPA:从DB而不是持久性上下文获取数据

Java JPA:从DB而不是持久性上下文获取数据,java,jpa,Java,Jpa,我有一个简单的用户帐户应用程序,用户可以在其中更改其详细信息 更新数据库 接受表单参数并调用服务方法的托管Bean方法: 服务方式: 从数据库获取数据 @PostConstruct public void init(){ userService = new UserService(); sessionController.setAuthUser(userService.read(getAuthUser().getId())); originCity = getAuthUs

我有一个简单的用户帐户应用程序,用户可以在其中更改其详细信息

更新数据库

接受表单参数并调用服务方法的托管Bean方法:

服务方式:

从数据库获取数据

@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()
,新的详细信息就会打印出来。在其他一些情况下,即使数据库条目已更新,也会打印旧的详细信息


结论:有时JPA会给我带来与DB不同的结果。我猜这个结果由来自持久性上下文的数据组成,这些数据没有更新。有没有一种方法可以确保JPA总是直接从DB获取数据?还是我缺少了什么?

你是说有没有办法在操作前关闭缓存或清空缓存

emf.getCache().evictAll();

如果您使用的是JPA 2,那么您的实体定义上的
@Cacheable(false)
应该使它每次都从数据库中读取。

谢谢!但这是一种好的做法吗?我认为这个缓存有它自己的角色。排除它是个好主意,还是我用错了JPA?
@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();
}
emf.getCache().evictAll();