Как исправить получение повторяющейся записи при обновлении сущности JpaRepository - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь обновить старую запись в моей базе данных новой сущностью. Необходимо сохранить исходную файловую сущность в БД, а затем обновить новую сущность соответствующей информацией, сохраненной в БД (включая идентификатор, который является первичным ключом). Но когда я пытаюсь сохранить новую сущность, я получаю 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. Я вижу, что это не работает, и я доказал себе, что информация правильно копируется в журналах. Я предполагаю, что что-то упускаю из-за того, что не обновляет информацию.

До того, как я добавил первое сохранение, оно работало, но из-за отсутствия УНИКАЛЬНОГО идентификатора для столбца MD5 оно вызывало дублирование, но я изменил это и добавил первоначальное сохранение, чтобы не допустить такого большого проникновения в файл. уже сохранен, прежде чем он будет пойман базой данных. По сути, это просто проверка в начале.

Это мой абстрактный обработчик:

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
    }
}

Это моя файловая сущность:

@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

}

Это мой Jpeg-объект:

@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      |

Но после того, как вся работа над ним завершена, он должен выглядеть следующим образом, когда достигнет второго сохранения:

| file_id |               md5              | Timestamp |
|---------|--------------------------------|-----------|
| 1       |033f6535fa99857722f43301e68d8b82| 2019-01-03|

Но, как я уже говорил выше, я чувствую, что это просто не работает или, возможно, работает, и я что-то упускаю. Если я что-то упускаю, что я пропускаю? Если это не работает, как вы предлагаете мне обойти эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...