У меня есть схема, в которой есть таблица отчетов с заголовком, в каждом отчете есть набор клиентов, а у каждого клиента есть набор продуктов, два отношения «один-ко-многим».
Вещь Мои клиенты и первичный ключ продукта являются составными, как показано во фрагментах.
Мой объект заголовка:
Я пытаюсь заполнить эти таблицы из денормализованной таблицы истории, где я создаю объект отчета, добавляю клиента в его набор клиентов и добавляю продукт в набор продуктов клиента, что-то вроде этого :
for (var record : bemHistoryEntities) {
String operator = record.getOperator();
String gskCustomerCode = record.getGskCustomerCode();
String distCustCode = record.getDistributorCustomerCode();
String distCode = record.getDistributorCode();
// getting the report header
List headersList = headerEntities.stream().filter(entity ->
(entity.getMonth() == month && entity.getYear() == year && operator.equals(entity.getOperator())))
.collect(Collectors.toList());
SamplesReportHeaderEntity headerEntity = null;
// header coming from the db
if (headersList.size() > 0) {
headerEntity = headersList.get(0);
} else {
// if not persisted before, create it
headerEntity = samplesReportHeaderRepository.save(new SamplesReportHeaderEntity().builder()
.operator(operator)
.month(month)
.year(year)
.printedYN('N')
.build());
headerEntities.add(headerEntity);
}
// creating samples customer from the record
SamplesReportCustomerEntity customer = new SamplesReportCustomerEntity().builder()
.id(new SamplesReportCustomerId(gskCustomerCode, headerEntity.getId(), distCustCode, distCode))
.bemArea(record.getBemArea())
.customerAddress(record.getDistributorCustomerAddress())
.customerName(record.getDistributorCustomerName())
.customerType(record.getBemCustomerType())
.jumpingYN(intermediateEntityMap.get(gskCustomerCode).getJumpingYN())
.repeatedSalesYN(intermediateEntityMap.get(gskCustomerCode).getRepeatedYN())
.expensiveItemsYN(intermediateEntityMap.get(gskCustomerCode).getExpensiveYN())
.productSalesYN(intermediateEntityMap.get(gskCustomerCode).getProductYN())
.normalSalesYN(intermediateEntityMap.get(gskCustomerCode).getNormalYN())
.build();
// creating samples product from the record to the created customer
SamplesReportProductEntity product = new SamplesReportProductEntity().builder()
.id(new SamplesReportProductId(distCode, distCustCode, record.getInvoiceNumber(), record.getSalesType(), record.getDistributorItemCode(), record.getBatchCode(), record.getInvoiceDate()))
.brand(record.getBrand())
.itemDescription(record.getGskItemDescription())
.GSKItemCode(record.getGskItemCode())
.build();
customer.getProducts().add(product);
headerEntity.getCustomers().add(customer);
}
Все в порядке, пока не начнется этап фиксации, он всегда пытается вставить строку в таблицу заголовков отчета, которую я никоим образом не создал, и даже если я напечатал содержимое контекста персистентности, это там тоже не было, и, конечно, это нарушает ненулевые ограничения, приводящие к сбою всей транзакции.
Детали: Неудачная строка содержит (70, null , ноль, ноль, null).
persistence context after the function execution:
Entity in context: HEADER: {67,10,2024,Hossam}
Entity in context: HEADER: {66,10,2024,Vacant}
Entity in context: HEADER: {69,10,2024,Samir}
Entity in context: HEADER: {68,10,2024,Saad}
Я отладил выполнение всей функции, но функция commitTransactionAfterReturning всегда выдает указанную выше ошибку.
У меня есть схема, в которой есть таблица отчетов с заголовком, в каждом отчете есть набор клиентов, а у каждого клиента есть набор продуктов, два отношения «один-ко-многим». Вещь Мои клиенты и первичный ключ продукта являются составными, как показано во фрагментах. Мой объект заголовка: [code]@Entity @Builder @Getter @NoArgsConstructor @Table(name = "samples_report_header") public class SamplesReportHeaderEntity implements Serializable {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id;
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; SamplesReportProductId that = (SamplesReportProductId) o; return Objects.equals(distributorCode, that.distributorCode) && Objects.equals(distributorCustomerCode, that.distributorCustomerCode) && Objects.equals(distributorInvoiceId, that.distributorInvoiceId) && Objects.equals(salesType, that.salesType) && Objects.equals(distributorItemCode, that.distributorItemCode) && Objects.equals(batchCode, that.batchCode) && Objects.equals(distributorInvoiceDate, that.distributorInvoiceDate); } @Override public int hashCode() { return Objects.hash(distributorCode, distributorCustomerCode, distributorInvoiceId, salesType, distributorItemCode, batchCode, distributorInvoiceDate); } } [/code] Я пытаюсь заполнить эти таблицы из денормализованной таблицы истории, где я создаю объект отчета, добавляю клиента в его набор клиентов и добавляю продукт в набор продуктов клиента, что-то вроде этого : [code]for (var record : bemHistoryEntities) { String operator = record.getOperator(); String gskCustomerCode = record.getGskCustomerCode(); String distCustCode = record.getDistributorCustomerCode(); String distCode = record.getDistributorCode();
// getting the report header List headersList = headerEntities.stream().filter(entity -> (entity.getMonth() == month && entity.getYear() == year && operator.equals(entity.getOperator()))) .collect(Collectors.toList()); SamplesReportHeaderEntity headerEntity = null;
// header coming from the db if (headersList.size() > 0) { headerEntity = headersList.get(0); } else { // if not persisted before, create it headerEntity = samplesReportHeaderRepository.save(new SamplesReportHeaderEntity().builder() .operator(operator) .month(month) .year(year) .printedYN('N') .build()); headerEntities.add(headerEntity); }
// creating samples customer from the record SamplesReportCustomerEntity customer = new SamplesReportCustomerEntity().builder() .id(new SamplesReportCustomerId(gskCustomerCode, headerEntity.getId(), distCustCode, distCode)) .bemArea(record.getBemArea()) .customerAddress(record.getDistributorCustomerAddress()) .customerName(record.getDistributorCustomerName()) .customerType(record.getBemCustomerType()) .jumpingYN(intermediateEntityMap.get(gskCustomerCode).getJumpingYN()) .repeatedSalesYN(intermediateEntityMap.get(gskCustomerCode).getRepeatedYN()) .expensiveItemsYN(intermediateEntityMap.get(gskCustomerCode).getExpensiveYN()) .productSalesYN(intermediateEntityMap.get(gskCustomerCode).getProductYN()) .normalSalesYN(intermediateEntityMap.get(gskCustomerCode).getNormalYN()) .build();
// creating samples product from the record to the created customer SamplesReportProductEntity product = new SamplesReportProductEntity().builder() .id(new SamplesReportProductId(distCode, distCustCode, record.getInvoiceNumber(), record.getSalesType(), record.getDistributorItemCode(), record.getBatchCode(), record.getInvoiceDate())) .brand(record.getBrand()) .itemDescription(record.getGskItemDescription()) .GSKItemCode(record.getGskItemCode()) .build();
customer.getProducts().add(product); headerEntity.getCustomers().add(customer); } [/code] Все в порядке, пока не начнется этап фиксации, он всегда пытается вставить строку в таблицу заголовков отчета, которую я никоим образом не создал, и даже если я напечатал содержимое контекста персистентности, это там тоже не было, и, конечно, это нарушает ненулевые ограничения, приводящие к сбою всей транзакции.
Детали: Неудачная строка содержит (70, null , ноль, ноль, null).
[code]persistence context after the function execution: Entity in context: HEADER: {67,10,2024,Hossam} Entity in context: HEADER: {66,10,2024,Vacant} Entity in context: HEADER: {69,10,2024,Samir} Entity in context: HEADER: {68,10,2024,Saad} [/code] Я отладил выполнение всей функции, но функция [b]commitTransactionAfterReturning[/b] всегда выдает указанную выше ошибку.