我有一个使用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[]
字段的值。
如果我要调试并花时间,则将该字段设置为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;
}
答案 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)
确实解决了这个问题。