Hibernate не выполняет вставки и обновления во время выполнения - PullRequest
0 голосов
/ 11 декабря 2018
@Transactional
public long generateInvoice(...) {
        final InvoiceEntity invoice = new InvoiceEntity(...);

        final InvoiceEntity dbInvoice = invoiceService.save(invoice);

        List<CorrectionEntity> corrections = correctionService.findAllByVendor(...);
        corrections.forEach(correction -> correction.setInvoice(dbInvoice));
        correctionService.saveAll(corrections);

        InvoiceEntity finalDBInvoice = invoiceService.getInvoiceById(dbInvoice.getId()).orElseThrow(IllegalStateException::new);

        documentService.generateExcel(finalDBInvoice);

        return dbInvoice.getId();
}

Как видите, я хочу установить все поправки для счета-фактуры, а затем перезагрузить их из базы данных для создания файла XLSX.

Проблема в том, что данные недоступны в finalDBInvoice потому что, как я заметил в журналах, INSERT s и UPDATE s выполняются в конце метода, вероятно из-за @Transactional.Когда я хочу создать файл Excel, поле corrections имеет значение null.

С моей точки зрения, я ожидал, что это будет работать должным образом.С JDBC что-то вроде этого работало бы, потому что каждый оператор выполнялся бы в нужное время в одной транзакции.

@Table(name = "invoice")
public class InvoiceEntity {
    @OneToMany(mappedBy = "futureInvoice", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<CorrectionEntity> corrections;
}

@Table(name = "correction")
public class CorrectionEntity extends BaseTimestampedEntity {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "future_invoice_id")
    private InvoiceEntity invoice;
}

1 Ответ

0 голосов
/ 11 декабря 2018

Вы правы. Транзитная фиксация транзакции в конце методов.у вас есть два варианта: 1. Разделяйте данные для сохранения и чтения, чтобы генерировать Excel в двух методах и вызывать их один за другим.2. использовать метод сброса после вставки или сохранения.как это:

//correct
@Transactional
public long generateInvoice(...) {
    final InvoiceEntity invoice = new InvoiceEntity(...);

    final InvoiceEntity dbInvoice = invoiceService.save(invoice);
    invoiceService.flush();

    List<CorrectionEntity> corrections = correctionService.findAllByVendor(...);
    corrections.forEach(correction -> correction.setInvoice(dbInvoice));
    correctionService.saveAll(corrections);

    InvoiceEntity finalDBInvoice = invoiceService.getInvoiceById(dbInvoice.getId()).orElseThrow(IllegalStateException::new);

    documentService.generateExcel(finalDBInvoice);

    return dbInvoice.getId();

}

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