我看到了数据库(MySQL 5)记录的“缓存”行为。我似乎看不到新的数据应用程序端没有登录/退出或重新启动应用服务器(Glassfish 3)。这是应用程序中唯一一个数据库记录被“卡住”的地方,我猜我在JPA持久性方面遗漏了一些东西。
我试过手动更改数据库记录,但仍有某种缓存机制在“帮助”我。
这是保存新数据的editFile()方法。
启动后,我看到数据库中的数据按预期更新。
this.file是视图用来显示文件数据的类级属性。它显示旧数据。在使用UPDATEsetter:filesList启动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);
}

正面
我的门面正在启动本机SQL来更新每个DB表。当我在他们开火后检查数据库时,数据正在进入,这一部分正在按我预期和希望的那样发生。
文件1
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;
}

文件类别
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();
}

如何取消缓存?
再次感谢您的光临。

最佳答案

我不认为缓存是问题,我认为是事务。

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();

我建议用事务将您的文章保存到数据库中,以使它们持久化。除非您提交请求,否则可能会返回没有更改的结果。
好的,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);
}

关于mysql - JPA缓存数据库结果,需要“取消缓存”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28323903/

10-09 00:36
查看更多