Skip to Content
0
Former Member
Oct 19, 2004 at 03:16 PM

JDO checker problem : could somebody please tell what I am doing wrong here

67 Views

I am having a strange problem with the JDO checker. I first read and tried out the exercise described in the "Getting Started with JDO" tutorial which is available both in the SAP Help files and as a download from this website. I am now trying to apply the learnings in a different project.

I created a Java project to create the PC Classes. In my scenario I have a Consultant object and a Solution Object. Both objects have a bi-directional many-to-many relationship. Consultant has a solutions field as a set of Solution Objects, and vice versa.

In the dictionary project I have created three tables

PFL_CONSULTANTS (holding the persistent fields of the Consultant object instances)

PFL_SAPSOLUTIONS (holding the persistent fields of the SAP Solution objects)

PFL_CONS_SOL_MAP (the mapping table)

As I learned from the help files I am using the JDO enhancer, following the instructions in the tutorial.

This means

- I created a Consultant.jdo and Solutions.jdo file

I am adding the Consultant.jdo file as an example

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE jdo SYSTEM "jdo.dtd">

<jdo>

<package name="com.atosorigin.tcc.portal.profiling.jdo">

<class name="Consultant" identity-type="application" objectid-class="Consultant$Id">

<field name="consId" persistence-modifier="persistent" primary-key="true"/>

<field name="firstname" persistence-modifier="persistent"/>

<field name="lastname" persistence-modifier="persistent"/>

<field name="country" persistence-modifier="persistent"/>

<field name="solutions" persistence-modifier="persistent" embedded="false" default-fetch-group="false" >

<collection element-type="com.atosorigin.tcc.portal.profiling.jdo.Solution" embedded-element="false"/>

</class>

</field>

</package>

</jdo>

- I created a mapping file for both classes, Consultant.map resp. Solution.map

I am adding the mapping file content for the Consultant class as an example:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE map SYSTEM "map.dtd">

<map version="1.0">

<package name="com.atosorigin.tcc.portal.profiling.jdo">

<class name="Consultant">

<field name="consId">

<column name="ID" table="PFL_CONSULTANTS" />

</field>

<field name="firstname">

<column name="FIRSTNAME" table="PFL_CONSULTANTS" />

</field>

<field name="lastname">

<column name="LASTNAME" table="PFL_CONSULTANTS" />

</field>

<field name="country">

<column name="COUNTRY" table="PFL_CONSULTANTS" />

</field>

<relationship-field name="solutions" multiplicity="many" join-table="true" >

<foreign-key name="PFL_CONS_SOL_MAP_TO_PFL_SAPSOLUTIONS"

foreign-key-table="PFL_CONS_SOL_MAP"

primary-key-table="PFL_SAPSOLUTIONS">

<column-pair foreign-key-column="SOLUTIONID" primary-key-column="ID" />

</foreign-key>

<foreign-key name="PFL_CONS_SOL_MAP_TO_PFL_CONSULTANTS"

foreign-key-table="PFL_CONS_SOL_MAP"

primary-key-table="PFL_CONSULTANTS">

<column-pair foreign-key-column="CONSULTANTID" primary-key-column="ID" />

</foreign-key>

</relationship-field>

</class>

</package>

</map>

As you can see, I have TWO foreign key nodes in the mapping file. This is as per instruction, because I am expressing a bi-directional many to many relationship. The join-table property is set to true.

- I created build.xml file for the ANT tool, which holds targets for running both the JDO enhancer and the checker against the classes and their ORM mapping information.

I hope this gives you an idea of what I am trying to do. Now over to the actual problem.

The enhancer works fine, no problem there. If I decompile the classes back, I can see that the enhancer has done its work as expected. The JDO interface implementation is there.

However, the checker keeps throwing errors. The error is one of two. Apparently the validating parser has a problem with the foreign-key nodes in the mapping file.

With the mapping file settings as displayed above the error thrown reads as follows :

[java] ... catalog path: TCCProfiling/gen_ddic/dbtables/

[java] javax.jdo.JDOFatalUserException: XML mapping data parse error

[java] NestedThrowables:

[java] com.atosorigin.tcc.portal.profiling.jdo.Consultant: check for PC Class failed / Validation Error: com.sap.engine.lib.xml.parser.ParserException: Unexpected element, foreign-key. It cannot appear here according to the content model of relationship-field(:main:, row:28, col:51)

[java] com.sap.engine.lib.xml.parser.NestedSAXParserException: Validation Error: com.sap.engine.lib.xml.parser.ParserException: Unexpected element, foreign-key. It cannot appear here according to the content model of relationship-field(:main:, row:28, col:51)(:main:, row=28, col=51) -> com.sap.engine.lib.xml.parser.ParserException: Unexpected element, foreign-key. It cannot appear here according to the content model of relationship-field(:main:, row:28, col:51)

[java] at com.sap.jdo.sql.mapping.impl.MappingModelImpl.lookupXMLMappingData(MappingModelImpl.java:532)

[java] at com.sap.jdo.sql.mapping.impl.MappingModelImpl.lookupXMLMappingData(MappingModelImpl.java:490)

[java] at com.sap.jdo.sql.mapping.impl.MappingModelImpl.getMappingClass(MappingModelImpl.java:296)

[java] at com.sap.jdo.sql.util.JDO.checkClasses(JDO.java:201)

[java] at com.sap.jdo.sql.util.JDO.process(JDO.java:423)

[java] at com.sap.jdo.sql.util.JDO.main(JDO.java:406)

[java] NestedThrowablesStackTrace:

[java] com.sap.engine.lib.xml.parser.NestedSAXParserException: Validation Error: com.sap.engine.lib.xml.parser.ParserException: Unexpected element, foreign-key. It cannot appear here according to the content model of relationship-field(:main:, row:28, col:51)(:main:, row=28, col=51) -> com.sap.engine.lib.xml.parser.ParserException: Unexpected element, foreign-key. It cannot appear here according to the content model of relationship-field(:main:, row:28, col:51)

[java] at com.sap.engine.lib.xml.parser.dtd.XMLValidator.startElement(XMLValidator.java:179)

[java] at com.sap.engine.lib.xml.parser.XMLParser.scanElement(XMLParser.java:1693)

[java] at com.sap.engine.lib.xml.parser.XMLParser.scanContent(XMLParser.java:2298)

[java] at com.sap.engine.lib.xml.parser.XMLParser.scanElement(XMLParser.java:1719)

[java] at com.sap.engine.lib.xml.parser.XMLParser.scanContent(XMLParser.java:2298)

[java] at com.sap.engine.lib.xml.parser.XMLParser.scanElement(XMLParser.java:1719)

[java] at com.sap.engine.lib.xml.parser.XMLParser.scanContent(XMLParser.java:2298)

[java] at com.sap.engine.lib.xml.parser.XMLParser.scanElement(XMLParser.java:1719)

[java] at com.sap.engine.lib.xml.parser.XMLParser.scanContent(XMLParser.java:2298)

[java] at com.sap.engine.lib.xml.parser.XMLParser.scanElement(XMLParser.java:1719)

[java] at com.sap.engine.lib.xml.parser.XMLParser.scanDocument(XMLParser.java:2701)

[java] at com.sap.engine.lib.xml.parser.XMLParser.parse0(XMLParser.java:162)

[java] at com.sap.engine.lib.xml.parser.AbstractXMLParser.parseAndCatchException(AbstractXMLParser.java:126)

[java] at com.sap.engine.lib.xml.parser.AbstractXMLParser.parse(AbstractXMLParser.java:141)

[java] at com.sap.engine.lib.xml.parser.AbstractXMLParser.parse(AbstractXMLParser.java:193)

[java] at com.sap.engine.lib.xml.parser.Parser.parseWithoutSchemaValidationProcessing(Parser.java:270)

[java] at com.sap.engine.lib.xml.parser.Parser.parse(Parser.java:328)

[java] at com.sap.engine.lib.xml.parser.SAXParser.parse(SAXParser.java:125)

[java] at com.sap.jdo.sql.mapping.xml.Parser_1_0.parse(Parser_1_0.java:203)

[java] at com.sap.jdo.sql.mapping.xml.Parser_1_0.parse(Parser_1_0.java:174)

[java] at com.sap.jdo.sql.mapping.impl.MappingModelImpl.lookupXMLMappingData(MappingModelImpl.java:526)

[java] at com.sap.jdo.sql.mapping.impl.MappingModelImpl.lookupXMLMappingData(MappingModelImpl.java:490)

[java] at com.sap.jdo.sql.mapping.impl.MappingModelImpl.getMappingClass(MappingModelImpl.java:296)

[java] at com.sap.jdo.sql.util.JDO.checkClasses(JDO.java:201)

[java] at com.sap.jdo.sql.util.JDO.process(JDO.java:423)

[java] at com.sap.jdo.sql.util.JDO.main(JDO.java:406)

[java] -


[java] at com.sap.engine.lib.xml.parser.SAXParser.parse(SAXParser.java:142)

[java] at com.sap.jdo.sql.mapping.xml.Parser_1_0.parse(Parser_1_0.java:203)

[java] at com.sap.jdo.sql.mapping.xml.Parser_1_0.parse(Parser_1_0.java:174)

[java] => 1 PC class(es) checked (1 failed), 0 non PC class(es) not checked

[java] at com.sap.jdo.sql.mapping.impl.MappingModelImpl.lookupXMLMappingData(MappingModelImpl.java:526)

[java] at com.sap.jdo.sql.mapping.impl.MappingModelImpl.lookupXMLMappingData(MappingModelImpl.java:490)

[java] at com.sap.jdo.sql.mapping.impl.MappingModelImpl.getMappingClass(MappingModelImpl.java:296)

[java] at com.sap.jdo.sql.util.JDO.checkClasses(JDO.java:201)

[java] at com.sap.jdo.sql.util.JDO.process(JDO.java:423)

[java] at com.sap.jdo.sql.util.JDO.main(JDO.java:406)

That would mean that having two foreign key nodes within the relationship-field node is not allowed. However, when I remove one of them I am told it SHOULD have two foreign-key nodes because join-table is set to true.

Is this a bug or could someone give me a hint about what I am doing wrong here.

Thanks in advance for your support.

Message was edited by: Theo Paesen