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