我做了一个功能,是上传文件到服务器。在数据表中存储服务器文件的路径。
用的是Spring + SpringMVC + Hibernate
流程是这样的,
1、查询当前表中是否保存过路径
2、判断当前是否有文件
3、如果有文件就先上传,上传成功后删除之前文件,删除失败则保留原先
4、如果没有就直接写入
5、保存
逻辑上没有什么问题,我也就这么操作了。但是就遇到一个很坑的事情,每次上传保存后,数据库存储了文件的路径,但是服务器上的文件竟然没有!
通过断点发现,在update之前,文件已经成功上传到服务器了,在执行update 操作后,服务器的文件没了!
很诡异
我还怀疑是Hibernate框架搞的鬼,查看了半天源码,没有发现什么问题。
后来,我去看实体类,这一看,发现了问题。
首先,我看着逻辑上也对。
每次设置的时候检查一下之前有没有存在的文件,如果有的话就先把旧的删除掉。
第二个删除前处理也对,在删除前先把文件给删掉。
但是,坑就坑在这里!
@PreRemove
我执行的merge操作更新记录,竟然也触发了@PreRemove方法!!!
这就导致,我更新前都会把这里的文件删掉!!!
真的是心情极不美丽,说好的删除前处理呢!这可是更新操作。
原因没有继续进一步深究,为什么会触发这个事件,不过这个坑我先记一下,日后在研究