我看到了数据库(MySQL 5)记录的“缓存”行为。我似乎无法看到新的数据应用程序端没有登录/注销或重新启动应用程序服务器(Glassfish 3)。这是应用程序中db记录“卡住”的唯一位置。我猜我错过了JPA持久性的东西。
我试图手动更改数据库记录,仍有某种缓存机制“帮助”我。
这是保存新数据的editFile()
方法。
this.file
是视图用于显示文件数据的类级属性。它显示旧数据。在我使用UPDATE
setter发出filesList
个查询后,我尝试将db数据移回其中:this.setFilesList(newFiles);
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();
}
如何取消缓存?
再次感谢您的光临。
答案 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);
}