JPA:从DB而不是Persistence Context获取数据

时间:2012-02-01 19:40:05

标签: java jpa

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

更新数据库

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总是直接从数据库中提取数据?或者有什么我想念的东西?

2 个答案:

答案 0 :(得分:1)

你的意思是有没有办法在操作之前关闭缓存或清空缓存?

emf.getCache().evictAll();

答案 1 :(得分:1)

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