Mise en veille prolongée: bug lors du mappage d'une référence à une alternative / colonne de clé naturelle d'une table de sous?

StackOverflow https://stackoverflow.com/questions/5818663

Question

La question initiale découle de cette question:

Pourquoi cette cartographie JPA 2.0 me donne une erreur dans Eclipse / JBoss Tools

Comme vous pouvez le voir cette constellation flippe également l'Eclipse Dali JPA validateur. La spécification JPA semble permettre cela comme on le voit ici (peu fiable):

Est-ce que la spécification JPA permet références à des colonnes de clé primaire?

Le code exact affiché dans la première question soulève également une mise en veille prolongée 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

Je suis particulièrement irrité par la « propriété récursive ». Après tout, il est juste une simple référence à colonne unique à un UNIQUE, NOT NULL colonne CHAR (2) d'un sous-pays de table de GeoAreas. Notez l'héritage pourrait avoir un certain impact, mais il est à mon humble avis encore pas trop compliqué.

Alors, est-ce un bug Hibernate?

Était-ce utile?

La solution

Répondre à ma propre question:

Il est pas un bogue dans Hibernate. Il est la spécification JPA 2.0 qui interdit les références à des colonnes non-PK lorsqu'il est utilisé comme identificateur dérivé en même temps. Voir mon autre réponse ici pour plus de détails:

Pourquoi cette cartographie JPA 2.0 me donne une erreur dans Eclipse / JBoss Tools

Notez qu'il est également à l'origine d'une exception avec la cartographie EclipseLink (vous obtenez juste une trace de la pile plus significative):

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top