Hibernate 6.6 schlägt fehl, wenn eine generische @Id in einer @MappedSuperclass vorhanden ist
Posted: 13 Jan 2025, 15:47
Org.springframework.boot:spring-boot-starter-parent wurde von 3.3.4 auf 3.4.0 geändert (und implizit von 6.5.3.Final in den Ruhezustand versetzt bis 6.6.2.Final), stieß ich auf java.lang.IllegalArgumentException: erwartete IdClass-Zuordnung für eine meiner geerbten @Entitys.
Die übergeordnete Klasse.
Eine der abgeleiteten Klassen, die zur Ausnahme führt. (Ich nehme an, dass die übrigen Erben das gleiche Problem haben, aber der Prozess sie nicht erreicht.)
Wenn meine Anwendung org.hibernate.persister.entity.AbstractEntityPersister.findAttributeMapping(String name) für LeaderId innerhalb der untergeordneten Entität erreicht, wird deklarierteAttributeMappings< /code> enthält alle Felder von „Parent“ und „Child“ mit Ausnahme von „leaderId“. Außerdem ist superMappingType null, also ist das Ergebnis des Aufrufs null.
Das führt zu der Situation, in der org.hibernate.metamodel.internal.AttributeFactory.resolveEntityMember(Property property, EntityPersister declaringEntity) restartVirtualIdentifierMember aufruft.
erfordert, dass der Bezeichner Mapping.getNature() VIRTUELL ist, aber in diesem Fall ist er EINFACH.
Das Ergebnis ist eine Ausnahme.
Ich habe Hibernate 6.6.3.Final und 6.6.4.Final ausprobiert. Das Verhalten ist das gleiche.
Jede Klarstellung ist willkommen. Gibt es in der neuen Version von Hibernate strengere Anforderungen, die ich nicht erfülle?
Die übergeordnete Klasse.
Code: Select all
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();
}
Code: Select all
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
}
Code: Select all
@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;
}
Code: Select all
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 {
// ...
}
}
Code: Select all
resolveVirtualIdentifierMember( Property property, EntityPersister entityPersister)
Code: Select all
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" );
}
// ...
}
Code: Select all
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
Jede Klarstellung ist willkommen. Gibt es in der neuen Version von Hibernate strengere Anforderungen, die ich nicht erfülle?