为了账号安全,请及时绑定邮箱和手机立即绑定

byte[] 设置为 null 后未为 null

byte[] 设置为 null 后未为 null

长风秋雁 2022-10-20 15:06:35
我有一个 Hibernate 5.2.17.Final 和 Java 8 和 MariaDB 的项目。我的实体有一个byte[]字段,我将文件保存到数据库中。在我使用该字段将文件发送到 S3 后,我想删除其内容(将其设置为 null),然后将该字段设置为null.我需要将该列保留在数据库中,因为这是一次升级,并且该列的条目具有非空值。我试过的:// first this:invoiceDTO.setPdf(null);// as the value of "PDF" is already null, invoice will have it also nullInvoice 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());同样,它不是空的。我错过了什么?
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

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


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)确实解决了问题。


查看完整回答
反对 回复 2022-10-20
  • 1 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信