[ https://issues.apache.org/jira/browse/OPENJPA-1736?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Catalina Wei updated OPENJPA-1736: ---------------------------------- Fix Version/s: (was: 2.0.1) Back out changes to 2.0.x branch. Updates to maintenance stream 2.0.x must get approval from Michael Dick. > Mappings with foreign keys as identity fields sometimes not resolved correctly > ------------------------------------------------------------------------------ > > Key: OPENJPA-1736 > URL: https://issues.apache.org/jira/browse/OPENJPA-1736 > Project: OpenJPA > Issue Type: Bug > Components: jdbc > Affects Versions: 2.0.0 > Reporter: Martin Dirichs > Assignee: Catalina Wei > Fix For: 2.1.0 > > Attachments: OpenJPA-2.0.0_OJ1736.patch, > OpenJPA-2.0.0_OJ1736.testcase.patch > > > This is a follow-up issue of OPENJPA-1141. The solution developed for that > issue only handled some aspects of an underlying greater problem with > OpenJPAs mapping algorithm. This algorithm may fail under certain > circumstances involving foreign keys used as identity fields in other > entities. A patch with a test case illustrating this problem is attached to > this issue. The problem can probably show up with different exceptions. > However, the stack trace for the supplied test case is as follows: > testEntityAsIdentityField001(org.apache.openjpa.persistence.identity.entityasidentity2.TestEntityAsIdentityFields2) > Time elapsed: 1.656 sec <<< ERROR! > <openjpa-2.0.0-r422266:935683M fatal user error> > org.apache.openjpa.persistence.ArgumentException: Errors encountered while > resolving metadata. See nested exceptions for details. > at > org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:642) > at > org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:385) > at > org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:358) > at > org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:688) > at > org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:617) > at > org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:385) > at > org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:358) > at > org.apache.openjpa.jdbc.meta.MappingRepository.getMapping(MappingRepository.java:355) > at > org.apache.openjpa.jdbc.meta.MappingTool.getMapping(MappingTool.java:679) > at > org.apache.openjpa.jdbc.meta.MappingTool.buildSchema(MappingTool.java:751) > at org.apache.openjpa.jdbc.meta.MappingTool.run(MappingTool.java:649) > at > org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:149) > at > org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:159) > at > org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.newBrokerImpl(JDBCBrokerFactory.java:117) > at > org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:199) > at > org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156) > at > org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:213) > at > org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:151) > at > org.apache.openjpa.persistence.identity.entityasidentity2.TestEntityAsIdentityFields2.testEntityAsIdentityField001(TestEntityAsIdentityFields2.java:16) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at junit.framework.TestCase.runTest(TestCase.java:154) > at > org.apache.openjpa.persistence.test.AbstractPersistenceTestCase.runTest(AbstractPersistenceTestCase.java:516) > at junit.framework.TestCase.runBare(TestCase.java:127) > at > org.apache.openjpa.persistence.test.AbstractPersistenceTestCase.runBare(AbstractPersistenceTestCase.java:503) > at > org.apache.openjpa.persistence.test.AbstractPersistenceTestCase.runBare(AbstractPersistenceTestCase.java:479) > at junit.framework.TestResult$1.protect(TestResult.java:106) > at junit.framework.TestResult.runProtected(TestResult.java:124) > at junit.framework.TestResult.run(TestResult.java:109) > at junit.framework.TestCase.run(TestCase.java:118) > at > org.apache.openjpa.persistence.test.AbstractPersistenceTestCase.run(AbstractPersistenceTestCase.java:179) > at junit.framework.TestSuite.runTest(TestSuite.java:208) > at junit.framework.TestSuite.run(TestSuite.java:203) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at > org.apache.maven.surefire.junit.JUnitTestSet.execute(JUnitTestSet.java:213) > at > org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) > at > org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) > at org.apache.maven.surefire.Surefire.run(Surefire.java:177) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at > org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345) > at > org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009) > Caused by: <openjpa-2.0.0-r422266:935683M fatal user error> > org.apache.openjpa.persistence.ArgumentException: The id class specified by > type "class > org.apache.openjpa.persistence.identity.entityasidentity2.Attendance" does > not match the primary key fields of the class. Make sure your identity class > has the same primary keys as your persistent type, including pk field types. > Mismatched property: "student" > at > org.apache.openjpa.meta.ClassMetaData.validateAppIdClassPKs(ClassMetaData.java:2205) > at > org.apache.openjpa.meta.ClassMetaData.validateAppIdClass(ClassMetaData.java:2079) > at > org.apache.openjpa.meta.ClassMetaData.validateIdentity(ClassMetaData.java:2015) > at > org.apache.openjpa.meta.ClassMetaData.validateMeta(ClassMetaData.java:1927) > at > org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1788) > at > org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataRepository.java:790) > at > org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:693) > at > org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:617) > ... 48 more > A proposed solution to this issue is given below. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.