如何解决在实体JpaRepository更新时获取重复条目的问题

时间:2019-01-04 22:48:55

标签: spring-boot jpa spring-data-jpa

我正在尝试使用新实体更新数据库中的旧文件条目。必不可少的是,我将初始文件实体保存到数据库,然后使用保存到数据库的相关信息(包括作为主键的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      |

但是,就像我在上面说的那样,我觉得这只是行不通,或者也许行得通,我想念一些东西。如果我缺少某些东西,我会缺少什么?如果不起作用,您如何建议我解决该问题?

0 个答案:

没有答案