byte [] не обнуляется после установки его в нуль - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть проект с Hibernate 5.2.17.Final и Java 8 с MariaDB.

У моего объекта есть поле byte[], в котором я сохраняю файл в БД.После того, как я использовал это поле для отправки файла на S3, я хочу удалить его содержимое (установив его на ноль), а затем сохранить объект в БД с этим полем, установленным на null.

Мне нужно сохранить этот столбец в БД, поскольку это обновление, и для этого столбца есть записи с ненулевым значением.

Что я пробовал:

// first this:
invoiceDTO.setPdf(null);
// as the value of "PDF" is already null, invoice will have it also null
Invoice invoice = invoiceFaMapper.toEntity(invoiceDTO);
invoice = invoiceFaRepository.save(invoice);

При отладке поле было нулевым, но значение в БД не равно нулю.

// then I tried this:
byte[] pdf = null;
invoice.setPdf(pdf);

, что также оставило мне ненулевое значение в БД, опять же, при отладкеinvoice имел ненулевое значение.

// last thing I tried was:
invoice.setPdf("".getBytes());

Опять же, он не был нулевым.

Чего мне не хватает?

РЕДАКТИРОВАТЬ: после invoice = invoiceFaRepository.save(invoice);это значение для поля byte[].

enter image description here

Если я отлаживаю и беру время, поле устанавливается равным нулю, еслинет точки разрыва, она не будет установлена ​​на ноль, но на предыдущее значение.

Я даже пробовал это после того, как уже сохранил его, чтобы сделать его нулевым, но безрезультатно.

invoice.setPdf(null);
invoiceFaRepository.save(invoice);

EDIT2: Invoice.java (актуально)

(...)

@Lob
@Column(name = "pdf")
private byte[] pdf;

(...)

public byte[] getPdf() {
    return pdf;
}

public Invoice pdf(byte[] pdf) {
    this.pdf = pdf;
    return this;
}

public void setPdf(byte[] pdf) {
    this.pdf = pdf;
}

1 Ответ

0 голосов
/ 27 апреля 2019

После сохранения объекта в БД я перенаправляю на этот объект. Поскольку в счете много строк, я запрашиваю счет-кву и его строки

Optional<InvoiceDTO> invoiceDTO = invoiceService.findOneWithLines(id);

Внутри этого метода у меня было что-то вроде этого:

    @Override
    public Optional<InvoiceFaDTO> findOneWithLines(long id) {
        Optional<Invoice> i = invoiceFaRepository.findById(id);
        i.ifPresent(invoice -> {
            if (invoice.getAttachmentUrl() != null) {
                invoice.setPdf(amazonService.downloadFile(invoice.getAttachmentUrl()).toByteArray());
            }
        });
        return i.map(invoiceFaMapper::toDto);
    }

Дело в том, что все, что я делаю в скобках, сохраняется в БД, и я не знаю почему (я не вызываю репозиторий, так почему бы это сохранить?).

Я решил проблему, отредактировав поле за пределами строки i.ifPresent(invoice -> {.

EDIT: класс Service был помечен @Transactional, добавление @Transactional(readOnly = true) действительно решило проблему.

...