Currently updating a Java Spring Boot application from spring-boot 1.5.11.RELEASE to spring-boot 3.3.1 and now I’m facing some problems while launching my app, since I had to update hibernate-jpa 2.1 lib to jakarta-persistence 3.1.0
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.NullPointerException: Cannot invoke "org.hibernate.metamodel.mapping.ModelPart.asBasicValuedModelPart()" because "subPart" is null
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1788) ~[spring-beans-6.1.10.jar:6.1.10]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) ~[spring-beans-6.1.10.jar:6.1.10]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.10.jar:6.1.10]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) ~[spring-beans-6.1.10.jar:6.1.10]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.10.jar:6.1.10]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) ~[spring-beans-6.1.10.jar:6.1.10]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) ~[spring-beans-6.1.10.jar:6.1.10]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) ~[spring-context-6.1.10.jar:6.1.10]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) ~[spring-context-6.1.10.jar:6.1.10]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.3.1.jar:3.3.1]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.3.1.jar:3.3.1]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.3.1.jar:3.3.1]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.3.1.jar:3.3.1]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) ~[spring-boot-3.3.1.jar:3.3.1]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) ~[spring-boot-3.3.1.jar:3.3.1]
at br.com.xbrain.iam.ApiApplication.main(ApiApplication.java:10) ~[classes/:na]
Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.NullPointerException: Cannot invoke "org.hibernate.metamodel.mapping.ModelPart.asBasicValuedModelPart()" because "subPart" is null
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421) ~[spring-orm-6.1.10.jar:6.1.10]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-6.1.10.jar:6.1.10]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.1.10.jar:6.1.10]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) ~[spring-beans-6.1.10.jar:6.1.10]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-6.1.10.jar:6.1.10]
... 15 common frames omitted
Caused by: java.lang.NullPointerException: Cannot invoke "org.hibernate.metamodel.mapping.ModelPart.asBasicValuedModelPart()" because "subPart" is null
at org.hibernate.metamodel.mapping.internal.AbstractDomainPath.addSortSpecification(AbstractDomainPath.java:227) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.metamodel.mapping.internal.AbstractDomainPath.apply(AbstractDomainPath.java:182) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.metamodel.mapping.internal.AbstractDomainPath.apply(AbstractDomainPath.java:128) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.metamodel.mapping.ordering.OrderByFragmentImpl.apply(OrderByFragmentImpl.java:35) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.loader.ast.internal.LoaderSelectBuilder.applyOrdering(LoaderSelectBuilder.java:752) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.loader.ast.internal.LoaderSelectBuilder.applyOrdering(LoaderSelectBuilder.java:734) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.loader.ast.internal.LoaderSelectBuilder.generateSelect(LoaderSelectBuilder.java:530) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.loader.ast.internal.LoaderSelectBuilder.createSelect(LoaderSelectBuilder.java:257) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.loader.ast.internal.CollectionLoaderSingleKey.<init>(CollectionLoaderSingleKey.java:56) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.persister.collection.AbstractCollectionPersister.createSingleKeyCollectionLoader(AbstractCollectionPersister.java:814) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.persister.collection.AbstractCollectionPersister.createNamedQueryCollectionLoader(AbstractCollectionPersister.java:799) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.persister.collection.AbstractCollectionPersister.postInstantiate(AbstractCollectionPersister.java:642) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at java.base/java.util.concurrent.ConcurrentHashMap$ValuesView.forEach(ConcurrentHashMap.java:4783) ~[na:na]
at org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.finishInitialization(MappingMetamodelImpl.java:210) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.internal.SessionFactoryImpl.initializeMappingModel(SessionFactoryImpl.java:371) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:300) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) ~[spring-orm-6.1.10.jar:6.1.10]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.1.10.jar:6.1.10]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-6.1.10.jar:6.1.10]
... 19 common frames omitted
Here’s my code:
@Data
@Entity
@Table(name = "user_hierarchy")
@NoArgsConstructor
@AllArgsConstructor
public class UserHierarchy {
@EmbeddedId
private UserHierarchyPk userHierarchy;
@JoinColumn(name = "fk_user", foreignKey = @ForeignKey(name = "fk_user_hierarchy_user"),
referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
@ManyToOne(fetch = FetchType.LAZY)
private User user;
@JoinColumn(name = "fk_user_leader", foreignKey = @ForeignKey(name = "fk_user_hierarchy_leader"),
referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
@ManyToOne(fetch = FetchType.LAZY)
private User userLeader;
}
@Data
@NoArgsConstructor
@EqualsAndHashCode(of = {"user", "userLeader"})
@Embeddable
public class UserHierarchyPk implements Serializable {
@Column(name = "fk_user", nullable = false)
private Integer user;
@Column(name = "fk_user_leader", nullable = false)
private Integer userLeader;
}
I did some debugging and found out that NullPointerException happens in AbstractDomainPath.java:226 while trying to add a sort specification
private void addSortSpecification(
EmbeddableValuedModelPart embeddableValuedModelPart,
QuerySpec ast,
TableGroup tableGroup,
String collation,
String modelPartName,
SortDirection sortOrder,
NullPrecedence nullPrecedence,
SqlAstCreationState creationState) {
if ( embeddableValuedModelPart.getFetchableName()
.equals( modelPartName ) || ELEMENT_TOKEN.equals( modelPartName ) ) {
embeddableValuedModelPart.forEachSelectable(
(columnIndex, selection) -> {
addSortSpecification(
selection,
ast,
tableGroup,
collation,
sortOrder,
nullPrecedence,
creationState
);
}
);
}
else {
ModelPart subPart = embeddableValuedModelPart.findSubPart( modelPartName, null );
addSortSpecification(
castNonNull( subPart.asBasicValuedModelPart() ), // LINE THAT THROWS NULLPOINTEREXCEPTION BECAUSE SUBPART IS NULL
ast,
tableGroup,
collation,
sortOrder,
nullPrecedence,
creationState
);
}
}
Some information from the method above:
- embeddableValuedModelPart.getFetchableName() = “usuarioHierarquiaPk”
- modelPartName = “id”
- ELEMENT_TOKEN = “$element$”
I tried to use @IdClass instead of EmbeddedId but it didn’t work