Весенняя загрузка JPA / Hibernate. NoSuchElementException при запуске - PullRequest
1 голос
/ 05 августа 2020

Надеюсь, кто-нибудь здесь может мне помочь. У меня самая ужасная проблема. Такое случается только иногда и никогда, когда я запускаю что-то локально.

У меня есть служба весенней загрузки, которая развернута в кластере кубернетов. Когда я запускаю его локально в производственной базе данных, все всегда работает. Но при запуске внутри 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

Любая помощь будет принята с благодарностью. Есть некоторые старые отношения сущностей, которые я не показываю в коде, но я мог бы добавить их, если три ничего необычного в том, что я включил.

Большое спасибо! Гисли

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...