Почему спящий режим выбрасывает исключение constraintViolationException? - PullRequest
0 голосов
/ 14 июля 2020

Сущность заказа

@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 идентификатор заказа. Из журналов мы можем подтвердить, что идентификатор заказа определенно не равен нулю.

Есть идеи, почему это происходит? Что можно сделать, чтобы это исправить?

...