Сущность заказа
@Entity
@Table(name = "Order",
indexes = {
@Index(name = "ORDER_X1", columnList = "REFERENCE_ID,SOURCE_ID"),
@Index(name = "ORDER_X2", columnList = "TYPE,STATUS")
}
)
@DiscriminatorColumn(name="PROCESSOR_TYPE", discriminatorType=DiscriminatorType.STRING, length = 80)
@SequenceGenerator(name="orderSeq", sequenceName="ORDER_SEQ")
@Inheritance(strategy= InheritanceType.JOINED)
public abstract class OrderEntity implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="orderSeq")
private Long id;
@ManyToMany(cascade={CascadeType.MERGE})
@JoinTable(
name = "FILE_ORDER_MAP",
joinColumns = {@JoinColumn(name = "ORDER_ID")},
inverseJoinColumns = {@JoinColumn(name = "FILE_ID")}
)
private Set<TransferFile> transferFiles = new HashSet<>();
@Column(name = "TYPE")
@Enumerated(EnumType.STRING)
private OrderType type;
@Column(name = "AMOUNT", precision = 12, scale = 2)
private LcMoney amount;
@Column(name = "STATUS")
@Enumerated(EnumType.STRING)
private OrderStatus reconStatus;
@Type(type = LcUtc.JPA_JODA_TIME_TYPE)
@Column(name = "STATUS_D", nullable = false)
@LcDateTimeUtc()
private DateTime reconStatusDate;
@Column(name = "REFERENCE_ID")
private Long referenceId;
@Column(name = "SOURCE_ID")
private Long sourceId;
@Column(name = "ACCOUNT_ID")
private Long accountId;
@Column(name = "PROCESSOR_TYPE", insertable = false, updatable = false)
@Enumerated(EnumType.STRING)
private OrderProcessorType processorType;
@Type(type = LcUtc.JPA_JODA_TIME_TYPE)
@Column(name = "TX_EXECUTION_D")
@LcDateTimeUtc()
private DateTime executedDate;
@Type(type = LcUtc.JPA_JODA_TIME_TYPE)
@Column(name = "CREATE_D")
@LcDateTimeUtc()
private DateTime createDate;
@Column(name = "IS_ON_DEMAND")
@Type(type = "yes_no")
private boolean isOnDemand;
@ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = {CascadeType.PERSIST})
@JoinColumn(name="PAYER_ID", nullable=true)
private Payer payer;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "ORDER_ID", referencedColumnName = "ID")
private List<OrderTransaction> orderTransactions;
@OneToMany(cascade = {CascadeType.ALL})
@JoinColumn(name = "ORDER_ID", referencedColumnName = "ID",
foreignKey = @ForeignKey(name = "FK_ORDER")
)
private List<MatchResult> matchResults;
@Version
@Column(name = "VERSION")
private Integer version;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "externalSourceId", column = @Column(name = "TRANS_EXT_SRC_ID")),
@AttributeOverride(name = "externalId", column = @Column(name = "TRANS_EXT_REF_ID"))
})
private LcExternalIdEntity transExtId;
@PreUpdate
@PrePersist
public void beforePersist() {
if (reconStatusDate != null) {
reconStatusDate = reconStatusDate.withZone(DateTimeZone.UTC);
}
if (executedDate != null) {
executedDate = executedDate.withZone(DateTimeZone.UTC);
}
if (createDate != null) {
createDate = createDate.withZone(DateTimeZone.UTC);
}
}
// getters and setters
}
//controller method
public Response processFile(){
// separate trasaction
service.readFileAndCreateOrders(); // read files and create orders in new status
List<Order> newOrders = service.getNewOrders();
for( Order order: newOrders){
service.processOrder(order); // separate transaction
}
}
@Transaction
void processOrder(OrderEntity order){
matchResultJpaRepository.save(orderEntity.id);
log.info("Saving matchId={} for order={}", match.getId(), order.getId());
// create new transaction and add to order
OrderTransaction transaction = createNewTransaction(order);
order.getTransactions().add(transaction);
order.setStatus("PROCESSED");
log.info("Saving Order id={}, Type={}, Status={} ", order.getId(), order.getType(), order.getStatus());
orderRepository.save(order);
}
Я вижу эту ошибку ниже.
ORA-01407: невозможно обновить ("ПЛАТЕЖИ". "MATCH_RESULT". "ORDER_ID ") в NULL
Эта конечная точка не предоставляется пользователю. Есть пакетное задание, которое вызывает эту конечную точку. Этот код существует как минимум год, и я впервые вижу это. Это произошло только один раз и всего за один звонок. Я вижу оба распечатанных журнала. Я озадачен, почему я вижу выше ошибку с жалобой на NULL идентификатор заказа. Из журналов мы можем подтвердить, что идентификатор заказа определенно не равен нулю.
Есть идеи, почему это происходит? Что можно сделать, чтобы это исправить?