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