Столкнулся с организацией.спящий режим.Исключение StaleStateException в производственной среде, но не для интеграционного тестирования

#sql #spring #spring-boot #hibernate #jpa

Вопрос:

Приведенная ниже ошибка возникает при запуске запланированной функции в приложении Spring Boot, однако в моем интеграционном тесте нет проблем, поскольку spring.jpa.hibernate.ddl-auto установлено значение create-only , но я не смог сделать то же самое для рабочего сервера. Я создал таблицу со следующей инструкцией SQL. В чем может быть возможная причина этой ошибки ?

Ошибка

 2021-11-23 18:22:37.005 INFO 26620 --- [pool-3-thread-1] com.itsedo.scheduler.ScheduledTasks : 18:22:37: Resending all failed Delivery Orders... ... ... Hibernate: insert into FailedDeliveryOrder (ccp_number, date, do_number, is_received, location_from, location_to, material_source, supplier, detail, status, title) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) Hibernate: insert into DeliveryOrder$Product (product_description, quantity, unit_of_measurement, DeliveryOrder_ID, ProductDes_Position) values (?, ?, ?, ?, ?) Hibernate: update DeliveryOrder$Product set DeliveryOrder_ID=?, ProductDes_Position=? where id=? 2021-11-23 18:22:37.036 ERROR 26620 --- [pool-3-thread-1] o.h.i.ExceptionMapperStandardImpl : HHH000346: Error during managed flush [Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1] 2021-11-23 18:22:37.054 INFO 26620 --- [pool-3-thread-1] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements 2021-11-23 18:22:37.054 ERROR 26620 --- [pool-3-thread-1] o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task.  org.springframework.orm.ObjectOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1  at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:320) ~[spring-orm-4.3.5.RELEASE.jar:4.3.5.RELEASE] HibernateJpaDialect.java:320  at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244) ~[spring-orm-4.3.5.RELEASE.jar:4.3.5.RELEASE] HibernateJpaDialect.java:244  

SQL для создания таблицы

 CREATE TABLE FAILEDDELIVERYORDER (  id BIGINT,  ccp_number VARCHAR(255),  date VARCHAR(255),  do_number VARCHAR(255),  is_received BIT,  location_from VARCHAR(255),  location_to VARCHAR(255),  material_source VARCHAR(255),  supplier VARCHAR(255),  detail VARCHAR(255),  status VARCHAR(255),  title VARCHAR(255) );  CREATE TABLE DeliveryOrder$Product (  id BIGINT,  product_description VARCHAR(255),  quantity VARCHAR(255),  unit_of_measurement VARCHAR(255),  deliveryorder_id BIGINT,  productdes_position INTEGER(10) );  ALTER TABLE DeliveryOrder$Product ADD FOREIGN KEY (deliveryorder_id) REFERENCES FAILEDDELIVERYORDER(id);  

Запланированная функция

 @Scheduled(cron = "* * * * * *")  public void resendFailedDeliveryOrder() {  logger.info("{}: Resending all failed Delivery Orders... ... ...", dateFormat.format(new Date()));  // create Delivery Order Object  Listlt;DeliveryOrder.Productgt; product = new ArrayListlt;DeliveryOrder.Productgt;();  product.add(new DeliveryOrder.Product());  DeliveryOrder deliveryOrder = new DeliveryOrder(product);  FailedDeliveryOrder failedDO_1 = new FailedDeliveryOrder(deliveryOrder);  failedDeliveryOrderRepository.save(failedDO_1);  }  

FailedDeliveryOrder.java

 @Table(name = "FailedDeliveryOrder") @Entity public class FailedDeliveryOrder {  @Id  @GeneratedValue(strategy = GenerationType.AUTO)  private Long id;  @Embedded  private DeliveryOrder deliveryOrder;    public FailedDeliveryOrder() {  }   public FailedDeliveryOrder(DeliveryOrder deliveryOrder) {  this.deliveryOrder = deliveryOrder;  }  //setter and getter }  

DeliveryOrder.java

 public class DeliveryOrder {   @Entity  public static class Product {  @Id  @GeneratedValue(strategy=GenerationType.AUTO)  private Long id;  public Product() {}  // setter and getter  }   @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})  @JoinColumn(  name = "DeliveryOrder_ID",  nullable = false  )  @OrderColumn(  name = "ProductDes_Position",  nullable = false  )  private Listlt;Productgt; product_descriptions = new ArrayListlt;Productgt;();   public DeliveryOrder() {  }   public DeliveryOrder(Listlt;Productgt; products) {  this.setProduct_descriptions(products);  }    public Listlt;Productgt; getProduct_descriptions() {  return product_descriptions;  }   public void setProduct_descriptions(Listlt;Productgt; product_descriptions) {  this.product_descriptions = product_descriptions;  } }