2011-04-28 45 views
0

原来的问题,从这个问题源于:Hibernate:将引用映射到子表的备选/自然键列时出错?

Why is this JPA 2.0 mapping giving me an error in Eclipse/JBoss Tools?

正如你可以看到这个星座也怪胎Eclipse的大理JPA验证。 JPA规范似乎让本作在这里看到(有点可靠):

Does the JPA specification allow references to non-primary key columns?

张贴在第一个问题的具体代码也提出了一个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)列的简单单列引用。请注意,这里的继承可能会产生一些影响,但它仍然不是过于复杂的恕我直言。

所以,这是一个Hibernate的bug?

回答

0

回答我自己的问题:

这不是Hibernate中的错误。 JPA 2.0规范禁止在同时用作派生标识符时引用非PK列。见我对方的回答此处了解详情:

Why is this JPA 2.0 mapping giving me an error in 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