@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;
}