Java 要使用hibernate查询中的事务从文件夹中删除现有文档,并从表中删除数据库值吗

Java 要使用hibernate查询中的事务从文件夹中删除现有文档,并从表中删除数据库值吗,java,spring,hibernate,postgresql,Java,Spring,Hibernate,Postgresql,我有一个上传文档的应用程序。上传文档后,新创建文档路径,并将文档保存在文件路径中。同时,文档路径和相关值保存在数据库表中。在上传后的我的应用程序中,有一个按钮可以删除不需要的文档。有时文档删除操作无法正常工作。因此会发生内存浪费。我想通过使用transaction语句来避免这种情况。我不知道如何使用hibernate事务来完成我的工作。这可能吗?请帮助我成功地完成这项工作(我正在使用带有hibernate集成和postgresql的spring) 多谢各位 内部控制器 int supDocId=

我有一个上传文档的应用程序。上传文档后,新创建文档路径,并将文档保存在文件路径中。同时,文档路径和相关值保存在数据库表中。在上传后的我的应用程序中,有一个按钮可以删除不需要的文档。有时文档删除操作无法正常工作。因此会发生内存浪费。我想通过使用transaction语句来避免这种情况。我不知道如何使用hibernate事务来完成我的工作。这可能吗?请帮助我成功地完成这项工作(我正在使用带有hibernate集成和postgresql的spring)

多谢各位

内部控制器

int supDocId=1102;
String docPath=D:/;
String filePath=docPath+supDocId+".pdf";
File file=new File(filePath);
boolean isDelete = servicesService.deleteDocument(supDocId);
if(isDelete)
{
if(file.exists())
    {
        file.delete();
    }
alertMsg = "The file is deleted sucessfully";   
    }
   else{
   alertMsg = "Deletion Failed.!!!  File is under processing..";    
}
在职班

public boolean deleteDocument(int supDocId){
    return servicesDAO.deleteDocument(supDocId);
}
服务类

public boolean deleteDocument(int supDocId){
int deleteStatus=0;
try {
  String deleteQuery = "DELETE FROM  tablename  WHERE attch_doc_id='"+supDocId+"'";
 Query deleteQ = session.createSQLQuery(deleteQuery);
 deleteStatus  = deleteQ.executeUpdate();                                       
 if(deleteStatus>0){    
   return deleteStatus;         
        }
    } catch (Exception e) {
        e.printStackTrace();
            }
        return deleteStatus;    
}

我想使用transaction语句在DAO类中执行两个操作(文档和数据库值删除)。

如果DB transaction失败,您不仅会遇到删除文件的问题,还会遇到上载新文件的问题

在大多数情况下,文件系统不支持事务,所以我认为使用XA(使用JTA的分布式事务)或类似方法无法实现防弹解决方案

在我的一些项目中,我使用了一种非常直接的解决方案:

  • 文件系统中的文件是在DB提交之前创建的(但最好是在hibernate刷新之后)
  • 在文件删除操作中,对文件的引用将从数据库中删除,但不会从文件系统中删除
  • 异步进程定期扫描文件系统中的所有文件,并从数据库中删除没有引用的文件。
  • 如果您有大量文件,可能需要进行一些优化,以防止总是扫描所有文件。例如:

  • 将新文件放入名为“当前日期”的文件夹中,以便仅检查部分文件是否存在涉及上载新文件的未成功事务
  • 在文件删除操作中,参照应删除的文件将新记录插入表“已删除的文件”
  • 创建异步进程,定期扫描表“已删除的\u文件”,删除物理文件,如果删除成功(或文件已丢失),则从表“已删除的\u文件”中删除记录并提交事务

  • 您不应该使用
    +supDocId+
    将其替换为
    ,否则您将容易受到Sql注入的影响

    deleteQ.Execute()
    是您希望执行的操作,而不是更新,因为您希望在删除某些内容时检查布尔值true或false