我有一个文档上传的应用程序。上传文档后,新创建文档路径,文档保存在文件路径中。同时文档路径和相关值保存在数据库表中。在上传后的应用程序中,有一个删除不需要的文件的按钮。有时文件删除操作不正常工作。因此会出现内存浪费。我想通过使用交易声明来避免这种情况。我不想&# 39;知道如何将hibernate事务用于我的工作。这可能吗?请帮助我成功完成工作(我使用带有hibernate集成的spring和postgresql)
谢谢
在控制器中
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);
}
在servicesDAO类
中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;
}
我想使用事务语句在DAO类中处理两个操作(文档和数据库值删除)。
答案 0 :(得分:0)
如果数据库事务失败 - 您不仅会遇到已删除文件的问题,还会对上传的新文件产生问题。
在大多数情况下,文件系统不支持事务,因此我不认为使用XA(使用JTA的分布式事务)或类似方法可以实现防弹解决方案。
我在一些项目中使用的相当直接的解决方案:
如果您有大量文件,则可能需要进行一些优化以防止始终扫描所有文件。例如:
答案 1 :(得分:0)
您不应该使用+supDocId+
替换为?
,否则您将容易受到 Sql Injection 的攻击。
deleteQ.Execute();
是你想要做的不是更新,因为你想要检查布尔值true或false,如果有东西被删除。