Проблема с составными первичными ключами в JPA (переход с hibernate-jpa 2.1 на jakarta-persistence 3.1.0)JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с составными первичными ключами в JPA (переход с hibernate-jpa 2.1 на jakarta-persistence 3.1.0)

Сообщение Anonymous »

В настоящее время обновляю приложение Java Spring Boot с spring-boot 1.5.11.RELEASE до spring-boot 3.3.1, и теперь я столкнулся с некоторыми проблемами при запуске мое приложение, так как мне пришлось обновить библиотеку hibernate-jpa 2.1 до 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.(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.(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
Вот мой код:

Код: Выделить всё

@Data
@Entity
@Table(name = "user_hierarchy")
@NoArgsConstructor
@AllArgsConstructor
public class UserHierarchy {

@EmbeddedId
private UserHierarchyPk userHierarchyPk;

@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;

}
Я провел некоторую отладку и обнаружил, что NullPointerException возникает в AbstractDomainPath.java:226 при попытке добавить спецификацию сортировки
р>

Код: Выделить всё

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
);
}
}
Некоторая информация из приведенного выше метода:
  • embeddableValuedModelPart.getFetchableName() = "userHierarchyPk"
  • modelPartName = "id"
  • ELEMENT_TOKEN = "$element$"
Я пробовал использовать @IdClass вместо EmbeddedId, но это не сработало

Подробнее здесь: https://stackoverflow.com/questions/787 ... jpa-2-1-to
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»