|
You are right about the <attribute-override> - got to read the spec more carefully :)
I have been testing the recent MVN version 442043. I can run without an orm.xml file included but as soon as I include some additional mappings in an orm.xml file I get errors. Here is some recent output: This is the command I use to execute: java -javaagent:./lib/openjpa-kernel-5-0.9.0-incubating-SNAPSHOT.jar -Dfile.encoding=MacRoman -classpath ./classes:./lib/openjpa-jdbc-0.9.0-incubating-SNAPSHOT.jar:./lib/openjpa-persistence-0.9.0-incubating-SNAPSHOT.jar:./lib/openjpa-lib-0.9.0-incubating-SNAPSHOT.jar:./lib/openjpa-kernel-5-0.9.0-incubating-SNAPSHOT.jar:./lib/commons-collections-3.2.jar:./lib/geronimo-jta_1.0.1B_spec-1.0.1.jar:./lib/geronimo-j2ee-connector_1.5_spec-1.0.1.jar:./lib/commons-pool-1.3.jar:./lib/serp-1.11.0.jar:./lib/hsqldb.jar:./lib/persistence-api-1.0.jar:./lib/commons-logging-1.0.4.jar:./lib/commons-dbcp-1.2.1.jar:./lib/openjpa-persistence-jdbc-0.9.0-incubating-SNAPSHOT.jar:./lib/commons-lang-2.1.jar:./lib/openjpa-kernel-0.9.0-incubating-SNAPSHOT.jar:./lib/openjpa-jdbc-5-0.9.0-incubating-SNAPSHOT.jar springdeveloper.TestApp persistence.xml: ================ <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="main" transaction-type="RESOURCE_LOCAL"> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> </persistence-unit> </persistence> orm.xml: ======== <?xml version="1.0" encoding="UTF-8"?> <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0"> <package>springdeveloper.domain</package> <entity class="Client" metadata-complete="false" access="FIELD"> </entity> <entity class="Manager" metadata-complete="false" access="FIELD"> <attributes> <basic name="description"> <column name="DESCR"/> </basic> </attributes> </entity> </entity-mappings> run: ==== 739 INFO [main] openjpa.MetaData - Found 2 classes with metadata in 17 milliseconds. TestApp! 364 INFO [main] openjpa.Runtime - Starting OpenJPA 0.9.0-incubating-SNAPSHOT 2353 INFO [main] openjpa.MetaData - Parsing resource "file:/Users/trisberg/Projects/plainJpa/classes/META-INF/orm.xml". 2787 INFO [main] openjpa.MetaData - Parsing class "springdeveloper.domain.Client". 2874 WARN [main] openjpa.Enhance - An exception was thrown while attempting to perform class file transformation on "springdeveloper/domain/Manager": java.lang.ClassCircularityError: springdeveloper/domain/Manager at java.lang.Class.getDeclaredFields0(Native Method) at java.lang.Class.privateGetDeclaredFields(Class.java:2232) at java.lang.Class.getDeclaredFields(Class.java:1715) at org.apache.openjpa.meta.AbstractMetaDataDefaults.populateFromReflection(AbstractMetaDataDefaults.java:176) at org.apache.openjpa.meta.AbstractMetaDataDefaults.populate(AbstractMetaDataDefaults.java:128) at org.apache.openjpa.persistence.PersistenceMetaDataDefaults.populate(PersistenceMetaDataDefaults.java:182) at org.apache.openjpa.meta.MetaDataRepository.addMetaData(MetaDataRepository.java:736) at org.apache.openjpa.persistence.XMLPersistenceMetaDataParser.startClass(XMLPersistenceMetaDataParser.java:720) at org.apache.openjpa.lib.meta.CFMetaDataParser.startElement(CFMetaDataParser.java:101) at org.apache.openjpa.lib.meta.XMLMetaDataParser.startElement(XMLMetaDataParser.java:427) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:533) at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:708) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:330) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1693) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:368) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1242) at javax.xml.parsers.SAXParser.parse(SAXParser.java:375) at org.apache.openjpa.lib.meta.XMLMetaDataParser.parseNewResource(XMLMetaDataParser.java:371) at org.apache.openjpa.lib.meta.XMLMetaDataParser.parse(XMLMetaDataParser.java:312) at org.apache.openjpa.lib.meta.XMLMetaDataParser.parse(XMLMetaDataParser.java:289) at org.apache.openjpa.lib.meta.XMLMetaDataParser.parse(XMLMetaDataParser.java:263) at org.apache.openjpa.persistence.PersistenceMetaDataFactory.parseXML(PersistenceMetaDataFactory.java:237) at org.apache.openjpa.persistence.PersistenceMetaDataFactory.load(PersistenceMetaDataFactory.java:188) at org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:432) at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:287) at org.apache.openjpa.enhance.PCEnhancer.<init>(PCEnhancer.java:164) at org.apache.openjpa.enhance.PCClassFileTransformer.transform(PCClassFileTransformer.java:115) at sun.instrument.TransformerManager.transform(TransformerManager.java:122) at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:155) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) at java.net.URLClassLoader.access$100(URLClassLoader.java:56) at java.net.URLClassLoader$1.run(URLClassLoader.java:195) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:242) at org.apache.openjpa.meta.MetaDataRepository.classForName(MetaDataRepository.java:1156) at org.apache.openjpa.meta.MetaDataRepository.loadPersistentTypes(MetaDataRepository.java:1144) at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:144) at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.newBrokerImpl(JDBCBrokerFactory.java:126) at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:164) at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:139) at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:171) at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:124) at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:50) at springdeveloper.TestApp.run(TestApp.java:48) at springdeveloper.TestApp.main(TestApp.java:22) 3663 TRACE [main] openjpa.jdbc.SQL - <t 2202705, conn 10336536> [0 ms] executing prepstmnt 9136910 SELECT SEQUENCE_SCHEMA, SEQUENCE_NAME FROM INFORMATION_SCHEMA.SYSTEM_SEQUENCES 3784 TRACE [main] openjpa.jdbc.SQL - <t 2202705, conn 2205493> [5 ms] executing stmnt 4450231 CREATE TABLE Client (id BIGINT NOT NULL, description VARCHAR(255), version INTEGER, manager_id BIGINT, PRIMARY KEY (id)) 3788 TRACE [main] openjpa.jdbc.SQL - <t 2202705, conn 6550654> [1 ms] executing stmnt 9974682 CREATE TABLE Manager (id BIGINT NOT NULL, DESCR VARCHAR(255), PRIMARY KEY (id)) 3799 TRACE [main] openjpa.jdbc.SQL - <t 2202705, conn 4102499> [7 ms] executing stmnt 14712126 CREATE INDEX I_CLIENT_MANAGER ON Client (manager_id) EM Open? true Exception in thread "main" <4|true|0.9.0-incubating-SNAPSHOT> org.apache.openjpa.persistence.ArgumentException: Could not locate metadata for the class using alias "Manager". Registered alias mappings: "{Manager=null}" at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:361) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getClassMetaData(JPQLExpressionBuilder.java:166) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.resolveClassMetaData(JPQLExpressionBuilder.java:144) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:213) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:183) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateType(JPQLExpressionBuilder.java:176) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.access$500(JPQLExpressionBuilder.java:63) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.populate(JPQLExpressionBuilder.java:1666) at org.apache.openjpa.kernel.jpql.JPQLParser.populate(JPQLParser.java:52) at org.apache.openjpa.kernel.ExpressionStoreQuery.populateFromCompilation(ExpressionStoreQuery.java:145) at org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:599) at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:581) at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:608) at org.apache.openjpa.kernel.QueryImpl.getOperation(QueryImpl.java:1421) at org.apache.openjpa.kernel.DelegatingQuery.getOperation(DelegatingQuery.java:120) at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:205) at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:254) at springdeveloper.MyTest.runQuery(MyTest.java:13) at springdeveloper.TestApp.run(TestApp.java:53) at springdeveloper.TestApp.main(TestApp.java:22) samoa:~/Projects/plainJpa trisberg$ Hmm ... the ClassCircularityError should have been resolved by my fix for
If it still fails, can you attach a new test case (just like the one for Marc,
I saw your fix for the circular reference and I don't see the error message right now after checking out the latest (now at rev. 442412). I'm getting an error building, but the jars seem to be created anyway. This is the last part of the build messages: [INFO] [jar:jar] [INFO] Building jar: /Users/trisberg/Projects/OpenJPA/openjpa-all/target/openjpa-all-0.9.0-incubating-SNAPSHOT.jar [INFO] ---------------------------------------------------------------------------- [INFO] Building OpenJPA Distribution [INFO] task-segment: [clean, package] [INFO] ---------------------------------------------------------------------------- [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] 'attached' was specified in an execution, but not found in the plugin [INFO] ------------------------------------------------------------------------ [INFO] For more information, run Maven with the -e switch [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2 minutes 5 seconds [INFO] Finished at: Mon Sep 11 21:57:00 EDT 2006 [INFO] Final Memory: 16M/59M [INFO] ------------------------------------------------------------------------ Anyway, I still get an exception executing my test - see attached zip file. Is this related to Exception in thread "main" <4|true|0.9.0-incubating-SNAPSHOT> org.apache.openjpa.persistence.ArgumentException: Could not locate metadata for the class using alias "Manager". Registered alias mappings: "{Manager=null}" at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:362) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getClassMetaData(JPQLExpressionBuilder.java:166) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.resolveClassMetaData(JPQLExpressionBuilder.java:144) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:213) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:183) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateType(JPQLExpressionBuilder.java:176) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.access$500(JPQLExpressionBuilder.java:63) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.populate(JPQLExpressionBuilder.java:1666) at org.apache.openjpa.kernel.jpql.JPQLParser.populate(JPQLParser.java:52) at org.apache.openjpa.kernel.ExpressionStoreQuery.populateFromCompilation(ExpressionStoreQuery.java:145) at org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:599) at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:581) at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:608) at org.apache.openjpa.kernel.QueryImpl.getOperation(QueryImpl.java:1421) at org.apache.openjpa.kernel.DelegatingQuery.getOperation(DelegatingQuery.java:120) at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:205) at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:254) at springdeveloper.MyTest.runQuery(MyTest.java:13) at springdeveloper.TestApp.run(TestApp.java:53) at springdeveloper.TestApp.main(TestApp.java:22) I'm surprised by the build error ... I haven't seen it before. However, I agree that it sounds like the jars are being built OK.
As for the "Could not locate metadata for the class.." error, that means that OpenJPA didn't load the class for some reason. If you change your query to query the full class name (e.g., change "select x from Manager x" to "select x from org.mypackage.Manager x"), do you get the same error? A better error message might result. Also, if you want to attach the new test case, I can take a look. Marc,
I did attach a test case - This is the output and mapping files - fully qualified name did not work either. persistence.xml: ================ <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="main" transaction-type="RESOURCE_LOCAL"> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> </persistence-unit> </persistence> orm.xml: ======== <?xml version="1.0" encoding="UTF-8"?> <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0"> <package>springdeveloper.domain</package> <entity class="Client" metadata-complete="false" access="FIELD"></entity> <entity class="Manager" metadata-complete="false" access="FIELD"> <attributes> <basic name="description"> <column name="DESCR" length="2000"/> </basic> </attributes> </entity> </entity-mappings> run: ==== TestApp! 172 INFO [main] openjpa.Runtime - Starting OpenJPA 0.9.0-incubating-SNAPSHOT 5019 TRACE [main] openjpa.jdbc.SQL - <t 14360544, conn 635451> [1 ms] executing prepstmnt 514941 SELECT SEQUENCE_SCHEMA, SEQUENCE_NAME FROM INFORMATION_SCHEMA.SYSTEM_SEQUENCES 5186 TRACE [main] openjpa.jdbc.SQL - <t 14360544, conn 5597932> [17 ms] executing stmnt 2898188 CREATE TABLE Client (id BIGINT NOT NULL, description VARCHAR(255), version INTEGER, manager_id BIGINT, PRIMARY KEY (id)) 5190 TRACE [main] openjpa.jdbc.SQL - <t 14360544, conn 4491208> [1 ms] executing stmnt 7717566 CREATE TABLE Manager (id BIGINT NOT NULL, DESCR VARCHAR(2000), PRIMARY KEY (id)) 5204 TRACE [main] openjpa.jdbc.SQL - <t 14360544, conn 9035974> [11 ms] executing stmnt 7059006 CREATE INDEX I_CLIENT_MANAGER ON Client (manager_id)EM Open? true Exception in thread "main" <4|true|0.9.0-incubating-SNAPSHOT> org.apache.openjpa.persistence.ArgumentException: The type "class springdeveloper.domain.Manager" has not been enhanced. at org.apache.openjpa.meta.ClassMetaData.resolveMeta(ClassMetaData.java:1544) at org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1518) at org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataRepository.java:660) at org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:567) at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:500) at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:301) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getClassMetaData(JPQLExpressionBuilder.java:164) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.resolveClassMetaData(JPQLExpressionBuilder.java:133) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:213) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:183) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateType(JPQLExpressionBuilder.java:176) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.access$500(JPQLExpressionBuilder.java:63) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.populate(JPQLExpressionBuilder.java:1666) at org.apache.openjpa.kernel.jpql.JPQLParser.populate(JPQLParser.java:52) at org.apache.openjpa.kernel.ExpressionStoreQuery.populateFromCompilation(ExpressionStoreQuery.java:145) at org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:599) at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:581) at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:608) at org.apache.openjpa.kernel.QueryImpl.getOperation(QueryImpl.java:1421) at org.apache.openjpa.kernel.DelegatingQuery.getOperation(DelegatingQuery.java:120) at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:205) at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:254) at springdeveloper.MyTest.runQuery(MyTest.java:13) at springdeveloper.TestApp.run(TestApp.java:53) at springdeveloper.TestApp.main(TestApp.java:22) We've committed a number of fixes to the class loading framework when using the class transformer, which appears to make this work.
Note, though, there are some errors in your orm.xml: you didn't declare the <mapped-superclass class="Person"/>, and you put overridden attributes in the <attributes> section, rather than the <attribute-override> section (which the spec mandates). I'll attach the corrected orm.xml to this report. Corrected orm.xml file.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
OPENJPA-40, the attribute-override element is, AFAIK, only meant to be used to redfine a field declared in a superclass entity. Since Manager doesn't actually have any Entity superclass, OpenJPA's assumption was causing an NPE. A better error message will now be thrown.