0

元の質問は、次の質問に由来します。

この JPA 2.0 マッピングによって Eclipse/JBoss Tools でエラーが発生するのはなぜですか?

ご覧のとおり、このコンスタレーションは Eclipse Dali JPA バリデーターもびっくりさせます。JPA仕様では、ここに示すようにこれが許可されているようです(ある程度信頼できます):

JPA 仕様では、非主キー列への参照が許可されていますか?

最初の質問に投稿された正確なコードでも、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

私は特に「再帰的性質」に苛立っています。結局のところ、GeoAreas サブテーブル Countries の UNIQUE, NOT NULL CHAR(2) 列への単純な単一列参照です。ここでは継承が何らかの影響を与える可能性がありますが、それでもそれほど複雑ではないことに注意してください。

それで、これは休止状態のバグですか?

4

1 に答える 1

0

私自身の質問に答える:

Hibernate のバグではありません。派生識別子として同時に使用される場合、非 PK 列への参照を禁止するのは JPA 2.0 仕様です。詳細については、こちらの他の回答を参照してください。

この JPA 2.0 マッピングによって Eclipse/JBoss Tools でエラーが発生するのはなぜですか?

EclipseLink でマッピング例外も発生していることに注意してください (より意味のあるスタック トレースを取得するだけです)。

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
于 2011-04-29T08:35:01.577 に答える