将byte []设置为null后不为null

时间:2019-04-23 20:04:52

标签: java mysql hibernate mariadb jhipster

我有一个使用Hibernate 5.2.17.Final和Java 8和MariaDB的项目。

我的实体有一个byte[]字段,我将文件保存到数据库中。在使用该字段将文件发送到S3之后,我要删除其内容(将其设置为null),然后将该字段设置为null并将实体保存到DB。

我需要将该列保留在数据库中,因为这是升级,并且该列的条目具有非空值。

我尝试过的事情:

// 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());

再次,它不是null。

我想念什么?

编辑:invoice = invoiceFaRepository.save(invoice);之后是byte[]字段的值。

enter image description here

如果我要调试并花时间,则将该字段设置为null,如果没有断点,则不会将其设置为null,而是设置为先前的值。

在将其保存为空后,我什至尝试过此操作,但无济于事。

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 :(得分:0)

将对象保存到数据库后,我将重定向到该对象。由于发票有很多行,我查询que发票及其行

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 -> {行之外的字段解决了该问题。

编辑:Service类用@Transactional注释,添加@Transactional(readOnly = true)确实解决了这个问题。