JPA缓存数据库结果,需要“解除缓存”

时间:2015-02-04 14:31:29

标签: mysql jpa

我看到了数据库(MySQL 5)记录的“缓存”行为。我似乎无法看到新的数据应用程序端没有登录/注销或重新启动应用程序服务器(Glassfish 3)。这是应用程序中db记录“卡住”的唯一位置。我猜我错过了JPA持久性的东西。

我试图手动更改数据库记录,仍有某种缓存机制“帮助”我。

这是保存新数据的editFile()方法。

  • 启动后,我看到数据库中的数据按预期更新。
  • this.file是视图用于显示文件数据的类级属性。它显示旧数据。在我使用UPDATE setter发出filesList个查询后,我尝试将db数据移回其中:this.setFilesList(newFiles);
  • 当应用程序将其读回时,GlassFish似乎已回复了此数据与旧数据的请求。

public void editFile(Map<String, String> params) {
    // update file1 record
    File1 thisFile = new File1();
    thisFile.setFileId(Integer.parseInt(params.get("reload-form:fileID")));
    thisFile.setTitle(params.get("reload-form:input-small-name"));
    thisFile.setTitle_friendly(params.get("reload-form:input-small-title-friendly"));
    this.filesFacade.updateFileRecord(thisFile);

    //update files_to_categories record
    int thisFileKeywordID = Integer.parseInt(params.get("reload-form:select0"));
    this.filesToCategoriesFacade.updateFilesToCategoriesRecords(thisFile.getFileId(), thisFileKeywordID);

    this.file = this.filesFacade.findFileByID(thisFile.getFileId());   
    List<File1> newFiles = (List<File1>)this.filesFacade.findAllByRange(low, high);
    this.setFilesList(newFiles);
}

外墙

My Facades正在触发本机SQL以更新每个数据库表。当我在发射后检查数据库时,数据会进入,这部分正在发生,正如我所期待的那样。

File1中

public int updateFileRecord(File1 file){
    String title = file.getTitle();
    String title_titleFriendly = file.getTitle_friendly();
    int fileID = file.getFileId();
    int result = 0;      

    Query q = this.em.createNativeQuery("UPDATE file1 set title = ?1, title_friendly = ?2 where file_id = ?3");
    q.setParameter(1, title);
    q.setParameter(2, title_titleFriendly);
    q.setParameter(3, fileID);
    result = q.executeUpdate();
    return result; 
}

FilesToCategories

public int updateFilesToCategoriesRecords(int fileId, int keywordID){
    Query q = this.em.createNativeQuery("UPDATE files_to_categories set categories = ?1 where file1 = ?2");
    q.setParameter(1, keywordID);
    q.setParameter(2, fileId);
    return q.executeUpdate();
}

如何取消缓存?

再次感谢您的光临。

2 个答案:

答案 0 :(得分:2)

我不认为缓存是问题所在,我认为这是交易。

em.getTransaction().begin(); 
Query q = this.em.createNativeQuery("UPDATE file1 set title = ?1, title_friendly = ?2 where file_id = ?3");
        q.setParameter(1, title);
        q.setParameter(2, title_titleFriendly);
        q.setParameter(3, fileID);
        result = q.executeUpdate();
em.getTransaction().commit();

我建议将你的作品交给带有交易的DB来保持它们。除非您提交请求,否则可能会在没有更改的情况下返回结果。

好的,JTA负责交易管理。

当您使用JPA时,为什么要这样做。

public int updateFileRecord(File1 file){
    String title = file.getTitle();
    String title_titleFriendly = file.getTitle_friendly();
    int fileID = file.getFileId();
    int result = 0;      
    Query q = this.em.createNativeQuery("UPDATE file1 set title = ?1, title_friendly = ?2 where file_id = ?3");
    q.setParameter(1, title);
    q.setParameter(2, title_titleFriendly);
    q.setParameter(3, fileID);
    result = q.executeUpdate();
    return result; 
}

这应该可以工作并更新JPA附带的内部状态

public int updateFileRecord(File1 file){
  em.persist(file);
}

答案 1 :(得分:0)

@daniel&amp; @Tiny让我继续这个,再次感谢你们。

  • 我想指出我在Entity Manager类中使用了.merge()方法。

  • 值得注意的是,对于.merge() 更新记录,而不是 INSERT 更新记录;您提交给.merge()的对象必须包含数据库表中各个字段(DAO知道的)的所有属性,否则您将 INSERT 新的数据库记录。< / p>


public void updateFileRecord(File1 file){
  em.merge(file);
}