Hibernate: bug quando mappatura di un riferimento ad un / colonna chiave alternativa naturale di una tabella sub?
-
26-10-2019 - |
Domanda
La domanda originale nasce da questa domanda:
Perché questa mappatura JPA 2.0 mi dà un errore in Eclipse / JBoss Tools?
Come si può vedere questa costellazione spaventa anche il validatore Eclipse Dali JPA. Le specifiche JPA sembra permettere questo come si vede qui (in qualche modo affidabile):
cosa la specifica JPA consentire i riferimenti alle colonne chiave non primarie?
Il codice esatto registrato nella prima questione solleva anche un Hibernate MappingException:
Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: geoareas] Unable to configure EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:374)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
at tld.geoareas.Main.main(Main.java:69)
Caused by: org.hibernate.MappingException: property [_tld_geoareas_model_Zip__identifierMapper.country] not found on entity [tld.geoareas.model.Country]
at org.hibernate.mapping.PersistentClass.getRecursiveProperty(PersistentClass.java:378)
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:414)
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:115)
at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1550)
at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1473)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1389)
at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1345)
at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1477)
at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1096)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:278)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:362)
... 4 more
Caused by: org.hibernate.MappingException: property [_tld_geoareas_model_Zip__identifierMapper.country] not found on entity [tld.geoareas.model.Country]
at org.hibernate.mapping.PersistentClass.getRecursiveProperty(PersistentClass.java:424)
at org.hibernate.mapping.PersistentClass.getRecursiveProperty(PersistentClass.java:375)
... 15 more
Sono particolarmente irritato dalla "proprietà ricorsivo". Dopo tutto, è solo un semplice riferimento a colonna singola ad un unico, NOT NULL CHAR (2) colonna di una GeoAreas sub Paesi tavolo. Si noti l'eredità potrebbe avere un certo impatto qui, ma è secondo me ancora non eccessivamente complicato.
Quindi, è questo un bug Hibernate?
Soluzione
Rispondendo alla mia domanda:
Non è un bug in Hibernate. E 'la 2.0 spec APP che vieta i riferimenti alle colonne non PK quando viene utilizzato come identificatore derivato allo stesso tempo. Vedi la mia altra risposta qui per maggiori dettagli:
Perché questa mappatura JPA 2.0 mi dà un errore in Eclipse / JBoss Tools?
Nota è anche causando un'eccezione mappatura con EclipseLink (basta ottenere una traccia dello stack più significativo):
Exception Description: The derived composite primary key attribute [country] of type [java.lang.String] from [tld.geoareas.model.ZipId] should be of the same type as its parent id field from [tld.geoareas.model.Country]. That is, it should be of type [java.lang.Integer].
at org.eclipse.persistence.exceptions.ValidationException.invalidDerivedCompositePKAttribute(ValidationException.java:1134)
at org.eclipse.persistence.internal.jpa.metadata.MetadataDescriptor.validateDerivedPKClassId(MetadataDescriptor.java:1817)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processId(ObjectAccessor.java:450)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processOwningMappingKeys(ObjectAccessor.java:659)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ManyToOneAccessor.process(ManyToOneAccessor.java:110)
at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ClassAccessor.processDerivedId(ClassAccessor.java:1409)
at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.processDerivedId(EntityAccessor.java:823)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processAccessorsWithDerivedIDs(MetadataProject.java:1294)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage3(MetadataProject.java:1560)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:484)
at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:453)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1080)
... 6 more