Надеюсь, кто-нибудь здесь может мне помочь. У меня самая ужасная проблема. Такое случается только иногда и никогда, когда я запускаю что-то локально.
У меня есть служба весенней загрузки, которая развернута в кластере кубернетов. Когда я запускаю его локально в производственной базе данных, все всегда работает. Но при запуске внутри k8s иногда возникает ошибка NoSuchElementException. Когда это происходит, часто бывает достаточно изменить слово в строке журнала, перестроить и развернуть заново. Кажется, это что-то, что делается на этапе сборки, потому что, когда возникает ошибка и модуль k8s пытается запустить снова и снова, он всегда терпит неудачу. Таким образом, один и тот же образ контейнера будет либо всегда работать, либо всегда давать сбой при запуске.
Это началось примерно в то время, когда я подключил Invoice с PropertyKey и User to Customer. До этого все было нормально. Речь идет о таких объектах, как User, ApiUser, Customer, Invoice, InvoiceLine и PropertyKey. Связь между ними следующая:
@Entity
public User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
…
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true )
private List<Customer> customers;
}
@Entity
public Customer {
@Id
private Long customerId;
…
@JsonIgnore
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;
...
@JsonIgnore
@OneToMany( mappedBy = "customer" )
private List<Invoice> invoices;
}
@Entity
public class Invoice
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long id;
…
@OneToMany( mappedBy = "parent", cascade = CascadeType.ALL )
List<InvoiceLine> lines;
@JsonIgnore
@ManyToOne( cascade = CascadeType.ALL )
@JoinColumn( name = "customer_id" )
//@Transient
private Customer customer;
@JsonIgnore
@ManyToOne
@JoinColumn( name = "prop_id", referencedColumnName = "propId" )
private PropertyKey propertyKey;
…
}
@Entity
public InvoiceLine {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long id;
…
@JsonIgnore
@ManyToOne
private Invoice parent;
…
}
@Entity
public class PropertyKey {
@Id
private Long propId;
…
@JsonIgnore
//@ManyToOne(fetch = FetchType.EAGER )
@ManyToOne
@JoinColumn( name = "api_user" )
private ApiUser apiUser;
…
@JsonIgnore
@OneToMany( mappedBy = "propertyKey" )
private List<Invoice> invoices;
...
}
@Entity
public class ApiUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
…
@OneToMany(mappedBy = "apiUser" )
//@Fetch(value = FetchMode.SUBSELECT)
private List<PropertyKey> propertyKeys;
…
}
Я оставил несколько комментариев на месте. Например, в классе Invoice Customer был временным свойством.
Я получаю следующую трассировку стека:
05.08.2020 14:26:24.258 [ERROR] SpringApplication - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.util.NoSuchElementException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1108)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
at is.godo.server.property.server.PropertyServer.main(PropertyServer.java:76)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:51)
at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:58)
Caused by: java.util.NoSuchElementException: null
at java.util.ArrayList$Itr.next(ArrayList.java:862)
at org.hibernate.cfg.annotations.TableBinder.linkJoinColumnWithValueOverridingNameIfImplicit(TableBinder.java:713)
at org.hibernate.cfg.PkDrivenByDefaultMapsIdSecondPass.doSecondPass(PkDrivenByDefaultMapsIdSecondPass.java:37)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1684)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1641)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:286)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1202)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1233)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792)
... 24 common frames omitted
Любая помощь будет принята с благодарностью. Есть некоторые старые отношения сущностей, которые я не показываю в коде, но я мог бы добавить их, если три ничего необычного в том, что я включил.
Большое спасибо! Гисли