我正在尝试使用新实体更新数据库中的旧文件条目。必不可少的是,我将初始文件实体保存到数据库,然后使用保存到数据库的相关信息(包括作为主键的ID)更新新实体。但是,当我尝试保存新实体时,会得到Variant
。我可以看到无法正常运行,我向我自己证明信息已正确复制到日志中。我以为我为什么不更新信息就缺少了什么。
在我添加第一个保存文件之前,它可以工作,但是由于缺少MD5列的UNIQUE标识符,这导致重复,但是我更改了此设置并添加了一个初始保存文件,以防止文件太远在被数据库捕获之前已经保存。基本上只是一开始的检查。
这是我的抽象处理程序:
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [md5_UNIQUE]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
这是我实现的处理程序:
public abstract class AbstractFileResolver {
@Autowired private FileRepository fileRepository;
protected abstract File processUpload(MultipartFile file, File entity) throws Exception;
protected abstract File found(File file);
public File upload(MultipartFile file) throws Exception {
String md5 = DigestUtils.md5Hex(file.getInputStream());
File found = fileRepository.findOneByMd5(md5);
if (null != found) return found(found);
File newFile = null;
try {
File f = new File();
f.setMd5(md5);
newFile = fileRepository.save(f);
return processUpload(file, newFile);
} catch (Exception e) {
LOG.error("There was an error processing upload.", e);
if (newFile != null) fileRepository.delete(newFile);
throw e;
}
}
}
这是我的文件实体:
public class JpegImageFileResolverImpl extends AbstractFileResolver {
@Autowired private FileRepository fileRepository;
@Autowired private ImageMetaData imageMetaData;
@Autowired private PropertiesBean properties;
@Override
protected File processUpload(MultipartFile file, File entity) throws Exception {
Jpeg model = (Jpeg) imageMetaData.loadImage(file, new Jpeg());
model.setFilePath(imageMetaData.generateNewFilePath(model));
java.io.File uploadedFile = new java.io.File(properties.rootDirectory + model.getFilePath());
FileUtils.writeByteArrayToFile(uploadedFile, file.getBytes());
model.setId(entity.getId()); // setting the import info
return fileRepository.save(model); // this is the error
}
}
这是我的Jpeg实体:
@Entity
@Table(name="files")
@Inheritance(strategy=InheritanceType.JOINED)
public class File {
@Id
@Column(name="file_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id = 0;
@Column(name="md5")
private String md5 = "";
@Column(name="uploaded")
private Timestamp uploaded;
// Getters and setters
}
这是我的抽象图像:
@Entity
@Table(name="jpegs")
public class Jpeg extends AbstractImage {
@Column(name="quality", nullable=false)
private String quality = "";
@Column(name="optimized", nullable=false)
private boolean optimized = false;
// Getters and setters
}
预期结果是,当我最初保存该表时,将如下所示:
@Entity
@Table(name="images")
public class AbstractImage extends File{
@Column(name="dpi", nullable=false)
private int dpi = 0;
// Getter and setter
}
但是,在完成所有工作之后,在第二次保存时它应该看起来像这样:
| file_id | md5 | Timestamp |
|---------|--------------------------------|-----------|
| 1 |033f6535fa99857722f43301e68d8b82| null |
但是,就像我在上面说的那样,我觉得这只是行不通,或者也许行得通,我想念一些东西。如果我缺少某些东西,我会缺少什么?如果不起作用,您如何建议我解决该问题?