Hibernate 6.6 не работает, если в @MappedSuperclass есть общий @Id.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Hibernate 6.6 не работает, если в @MappedSuperclass есть общий @Id.

Сообщение Anonymous »

Изменив org.springframework.boot:spring-boot-starter-parent с 3.3.4 на 3.4.0 (и неявно Hibernate с 6.5.3.Final до 6.6.2.Final), я столкнулся с java.lang.IllegalArgumentException: ожидаю сопоставления IdClass для одного из моих унаследовал @Entity.
Родительский класс.

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

import jakarta.persistence.Column;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;
import org.springframework.lang.Nullable;
import java.io.Serializable;
// ... other imports

@MappedSuperclass
public abstract class Parent {

protected static final String LEADER_ID_COLUMN = "LEADER_ID";

@Id
@Column(name = LEADER_ID_COLUMN, nullable = false, updatable = false)
@Nullable
private K leaderId;

// ... other fields

@Nullable
public K getLeaderId() {
return leaderId;
}

public C setLeaderId(K entityId) {
this.leaderId = entityId;
return itself();
}

// ... getters/setters/equals/hashCode/toString

protected abstract C itself();

}
Один из производных классов, который приводит к исключению. (Предполагаю, что у остальных наследников та же проблема, но процесс до них не доходит.)

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

import jakarta.persistence.Entity;
import org.springframework.lang.Nullable;
// ... other imports

@Entity
public class Child extends Parent {

// ... fields/getters/setters

@Override
protected Child itself() {
return this;
}

// ... equals/hashCode/toString

}
Когда мое приложение достигает org.hibernate.persister.entity.AbstractEntityPersister.findAttributeMapping(String name) для LeaderId внутри дочернего объекта, объявленныйAttributeMappings< /code> содержит все поля родительского и дочернего, кроме LeaderId. Плюс superMappingType имеет значение null, поэтому результат вызова равен нулю.

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

    @Override
public AttributeMapping findAttributeMapping(String name) {
final AttributeMapping declaredAttribute = declaredAttributeMappings.get( name );
if ( declaredAttribute != null ) {
return declaredAttribute;
}

if ( superMappingType != null ) {
return superMappingType.findAttributeMapping( name );
}

return null;
}
Это приводит к ситуации, когда org.hibernate.metamodel.internal.AttributeFactory.resolveEntityMember(свойство Property, EntityPersister DeclaringEntity) вызываетsolveVirtualIdentifierMember.

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

    private static Member resolveEntityMember(Property property, EntityPersister declaringEntity) {
String propertyName = property.getName();
AttributeMapping attributeMapping = declaringEntity.findAttributeMapping(propertyName);
if (attributeMapping == null) {
return resolveVirtualIdentifierMember(property, declaringEntity);
} else {
// ...
}
}

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

resolveVirtualIdentifierMember( Property property, EntityPersister entityPersister)
требует, чтобы идентификатор Mapping.getNature() был ВИРТУАЛЬНЫМ, но в этом случае он ПРОСТОЙ.

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

    private static Member resolveVirtualIdentifierMember( Property property, EntityPersister entityPersister) {
final EntityIdentifierMapping identifierMapping = entityPersister.getIdentifierMapping();

if ( identifierMapping.getNature() != EntityIdentifierMapping.Nature.VIRTUAL ) {
throw new IllegalArgumentException( "expecting IdClass mapping" );
}

// ...
}
Результат является исключением.

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

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]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory;  nested exception is java.lang.IllegalArgumentException:  e x p e c t i n g   I d C l a s s   m a p p i n g < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . i n i t i a l i z e B e a n ( A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . j a v a : 1 8 0 2 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . d o C r e a t e B e a n ( A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . j a v a : 6 0 1 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . c r e a t e B e a n ( A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . j a v a : 5 2 3 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t B e a n F a c t o r y . l a m b d a $ d o G e t B e a n $ 0 ( A b s t r a c t B e a n F a c t o r y . j a v a : 3 3 6 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . D e f a u l t S i n g l e t o n B e a n R e g i s t r y . g e t S i n g l e t o n ( D e f a u l t S i n g l e t o n B e a n R e g i s t r y . j a v a : 2 8 8 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t B e a n F a c t o r y . d o G e t B e a n ( A b s t r a c t B e a n F a c t o r y . j a v a : 3 3 4 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t B e a n F a c t o r y . g e t B e a n ( A b s t r a c t B e a n F a c t o r y . j a v a : 2 0 4 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . c o n t e x t . s u p p o r t . A b s t r a c t A p p l i c a t i o n C o n t e x t . f i n i s h B e a n F a c t o r y I n i t i a l i z a t i o n ( A b s t r a c t A p p l i c a t i o n C o n t e x t . j a v a : 9 7 0 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . c o n t e x t . s u p p o r t . A b s t r a c t A p p l i c a t i o n C o n t e x t . r e f r e s h ( A b s t r a c t A p p l i c a t i o n C o n t e x t . j a v a : 6 2 7 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b o o t . S p r i n g A p p l i c a t i o n . r e f r e s h ( S p r i n g A p p l i c a t i o n . j a v a : 7 5 2 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b o o t . S p r i n g A p p l i c a t i o n . r e f r e s h C o n t e x t ( S p r i n g A p p l i c a t i o n . j a v a : 4 3 9 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b o o t . S p r i n g A p p l i c a t i o n . r u n ( S p r i n g A p p l i c a t i o n . j a v a : 3 1 8 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b o o t . t e s t . c o n t e x t . S p r i n g B o o t C o n t e x t L o a d e r . l a m b d a $ l o a d C o n t e x t $ 3 ( S p r i n g B o o t C o n t e x t L o a d e r . j a v a : 1 3 7 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . u t i l . f u n c t i o n . T h r o w i n g S u p p l i e r . g e t ( T h r o w i n g S u p p l i e r . j a v a : 5 8 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . u t i l . f u n c t i o n . T h r o w i n g S u p p l i e r . g e t ( T h r o w i n g S u p p l i e r . j a v a : 4 6 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b o o t . S p r i n g A p p l i c a t i o n . w i t h H o o k ( S p r i n g A p p l i c a t i o n . j a v a : 1 4 6 1 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b o o t . t e s t . c o n t e x t . S p r i n g B o o t C o n t e x t L o a d e r $ C o n t e x t L o a d e r H o o k . r u n ( S p r i n g B o o t C o n t e x t L o a d e r . j a v a : 5 5 3 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b o o t . t e s t . c o n t e x t . S p r i n g B o o t C o n t e x t L o a d e r . l o a d C o n t e x t ( S p r i n g B o o t C o n t e x t L o a d e r . j a v a : 1 3 7 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . b o o t . t e s t . c o n t e x t . S p r i n g B o o t C o n t e x t L o a d e r . l o a d C o n t e x t ( S p r i n g B o o t C o n t e x t L o a d e r . j a v a : 1 0 8 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . t e s t . c o n t e x t . c a c h e . D e f a u l t C a c h e A w a r e C o n t e x t L o a d e r D e l e g a t e . l o a d C o n t e x t I n t e r n a l ( D e f a u l t C a c h e A w a r e C o n t e x t L o a d e r D e l e g a t e . j a v a : 2 2 5 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . t e s t . c o n t e x t . c a c h e . D e f a u l t C a c h e A w a r e C o n t e x t L o a d e r D e l e g a t e . l o a d C o n t e x t ( D e f a u l t C a c h e A w a r e C o n t e x t L o a d e r D e l e g a t e . j a v a : 1 5 2 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . t e s t . c o n t e x t . s u p p o r t . D e f a u l t T e s t C o n t e x t . g e t A p p l i c a t i o n C o n t e x t ( D e f a u l t T e s t C o n t e x t . j a v a : 1 3 0 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . t e s t . c o n t e x t . j u n i t . j u p i t e r . S p r i n g E x t e n s i o n . g e t A p p l i c a t i o n C o n t e x t ( S p r i n g E x t e n s i o n . j a v a : 3 5 2 ) < b r   / >         a t   o r g . s p r i n g f r a m e w o r k . t e s t . c o n t e x t . j u n i t . j u p i t e r . S p r i n g E x t e n s i o n . r e s o l v e P a r a m e t e r ( S p r i n g E x t e n s i o n . j a v a : 3 3 8 ) < b r   / >         a t   o r g . j u n i t . j u p i t e r . e n g i n e . e x e c u t i o n . P a r a m e t e r R e s o l u t i o n U t i l s . r e s o l v e P a r a m e t e r ( P a r a m e t e r R e s o l u t i o n U t i l s . j a v a : 1 3 6 ) < b r   / >         a t   o r g . j u n i t . j u p i t e r . e n g i n e . e x e c u t i o n . P a r a m e t e r R e s o l u t i o n U t i l s . r e s o l v e P a r a m e t e r s ( P a r a m e t e r R e s o l u t i o n U t i l s . j a v a : 1 0 3 ) < b r   / >         a t   o r g . j u n i t . j u p i t e r . e n g i n e . e x e c u t i o n . I n t e r c e p t i n g E x e c u t a b l e I n v o k e r . i n v o k e ( I n t e r c e p t i n g E x e c u t a b l e I n v o k e r . j a v a : 5 9 ) < b r   / >         a t   o r g . j u n i t . j u p i t e r . e n g i n e . d e s c r i p t o r . C l a s s B a s e d T e s t D e s c r i p t o r . i n v o k e T e s t C l a s s C o n s t r u c t o r ( C l a s s B a s e d T e s t D e s c r i p t o r . j a v a : 3 6 4 ) < b r   / >         a t   o r g . j u n i t . j u p i t e r . e n g i n e . d e s c r i p t o r . C l a s s B a s e d T e s t D e s c r i p t o r . i n s t a n t i a t e T e s t C l a s s ( C l a s s B a s e d T e s t D e s c r i p t o r . j a v a : 3 1 1 ) < b r   / >         a t   o r g . j u n i t . j u p i t e r . e n g i n e . d e s c r i p t o r . C l a s s T e s t D e s c r i p t o r . i n s t a n t i a t e T e s t C l a s s ( C l a s s T e s t D e s c r i p t o r . j a v a : 7 9 ) < b r   / >         a t   o r g . j u n i t . j u p i t e r . e n g i n e . d e s c r i p t o r . C l a s s B a s e d T e s t D e s c r i p t o r . i n s t a n t i a t e A n d P o s t P r o c e s s T e s t I n s t a n c e ( C l a s s B a s e d T e s t D e s c r i p t o r . j a v a : 2 8 7 ) < b r   / >         a t   o r g . j u n i t . j u p i t e r . e n g i n e . d e s c r i p t o r . C l a s s B a s e d T e s t D e s c r i p t o r . l a m b d a$testInstancesProvider$5(ClassBasedTestDescriptor.java:279)
at java.base/java.util.Optional.orElseGet(Optional.java:364)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278)
at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$before$3(ClassBasedTestDescriptor.java:204)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:203)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:85)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:153)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:63)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
Caused by:  jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.IllegalArgumentException: expecting IdClass mapping
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:431)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798)
... 75 more
Caused by: java.lang.IllegalArgumentException: expecting IdClass mapping
at org.hibernate.metamodel.internal.AttributeFactory.resolveVirtualIdentifierMember(AttributeFactory.java:715)
at org.hibernate.metamodel.internal.AttributeFactory.resolveEntityMember(AttributeFactory.java:765)
at org.hibernate.metamodel.internal.AttributeFactory.resolveMappedSuperclassMember(AttributeFactory.java:781)
at org.hibernate.metamodel.internal.AttributeFactory.lambda$static$2(AttributeFactory.java:746)
at org.hibernate.metamodel.internal.AttributeFactory.determineAttributeMetadata(AttributeFactory.java:460)
at org.hibernate.metamodel.internal.AttributeFactory.buildAttribute(AttributeFactory.java:122)
at org.hibernate.metamodel.internal.AttributeFactory.buildAttribute(AttributeFactory.java:108)
at org.hibernate.metamodel.internal.MetadataContext.buildAttribute(MetadataContext.java:289)
at org.hibernate.metamodel.internal.MetadataContext.wrapUp(MetadataContext.java:374)
at org.hibernate.metamodel.model.domain.internal.JpaMetamodelImpl.processJpa(JpaMetamodelImpl.java:618)
at org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.finishInitialization(MappingMetamodelImpl.java:216)
at org.hibernate.internal.SessionFactoryImpl.initializeMappingModel(SessionFactoryImpl.java:373)
at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:302)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:463)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419)
... 79 more
Я попробовал Hibernate 6.6.3.Final. Поведение такое же.
Любые разъяснения приветствуются. Есть ли в новой версии Hibernate более строгие требования, которым я не отвечаю?

Подробнее здесь: https://stackoverflow.com/questions/792 ... superclass
Ответить

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

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

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

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

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