Werner,

Never mind ;-) If I wouldn't think Castor JDO can handle 1:n relations I wouldn't have used it.
However, as I already pointed out, I've used EJB 2.0 CMR as well as Apache OJB so far.
Both of them basically worked the way _I_ would expect. Somehow the Castor JDO approach must be different - otherwise things would be running for me.
BTW: Translating the Castor JDO mapping to Apache OJB was really easy - almost only some kind of "reformat". Using the mappings and classes already posted the code is working as I expected.


Axel


Werner Guttmann wrote:

Axel,

it's your decision after all. It's a shame 'cause 1:M relations are working
with Castor JDO and have been doing so for quite some yrs. Unless of course
users get things wrong .. ;-).

Werner


Werner,

Since I have to get things up and running pretty soon I decided to use
Apache OJB as O/R mapping tool but continue to use Castor XML for XML
binding.
From a previous project I knew that 1:n relations in OJB are working
without problems the way I wouold expect them to work.
Thanks again for the help you offered!

Axel

Werner Guttmann wrote:



Axel,

just looking at your problem right now, but it seems I still need some


classes to get this to compiel and run correctly. Here's a list of classes


I


seem to be

missing:

com.ibm.rfid.testcontroller.ValueRange
com.ibm.rfid.testcontroller.PersistenceException;
com.ibm.rfid.testcontroller.PersistenceUtil;
com.ibm.rfid.testcontroller.UrlObjectTreeProvider;
com.ibm.rfid.testcontroller.TestcaseException
com.ibm.rfid.testcontroller.TestRun

Thanks for your help. Feel free to send these files to me privately ...
Werner

On Sun, 08 Aug 2004 20:44:03 +0200, Werner Guttmann wrote:





Thanks, Axel. I'll let you know about any progress I make ...

Werner

On Sun, 08 Aug 2004 08:25:28 +0200, Axel Mueller wrote:





Werner,

Werner Guttmann wrote:





Axel,

On Sat, 07 Aug 2004 09:18:47 +0200, Axel Mueller wrote:







Werner,

Thanks for your reply! From your post I conclude that there is no obvious mistake I made.






Well, actually, this is not the case. Whilst I have not spotted any


mistakes so far, it could equally be that there is ... hence my desire to
'replay' your


scenario. Speaking of which, could be you please post your Java


classes as well ?






So there is still hope the Castor rocks but the user doesn't ;-)
Below are the classes (straight forward I would think). You can run the
Junit test class TestcaseFactoryTest in order to replay the test.



----------------------------------------------------------------------------------------------


package com.ibm.rfid.testcontroller;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.exolab.castor.jdo.Database;

/**
* @author Axel Mueller
*/
public abstract class PersistentObjectFactory {

private static Log logger = LogFactory.getLog(PersistentObjectFactory.class);

 protected ClassLoader classLoader = null;

 protected Database db = null;

 protected boolean useExternalTransaction = false;


public PersistentObjectFactory(ClassLoader classLoader) { this.classLoader = classLoader; }

 public void setDatabase(Database db) {
     this.db = db;
     useExternalTransaction = true;
     logger.debug("Using external transaction.");
 }

}



----------------------------------------------------------------------------------------------


package com.ibm.rfid.testcontroller.testcase;

import java.util.Iterator;
import java.util.Vector;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.exolab.castor.jdo.OQLQuery;
import org.exolab.castor.jdo.QueryResults;

import com.ibm.rfid.testcontroller.PersistenceException;
import com.ibm.rfid.testcontroller.PersistenceUtil;
import com.ibm.rfid.testcontroller.PersistentObjectFactory;
import com.ibm.rfid.testcontroller.UrlObjectTreeProvider;

/**
* @author Axel Mueller
*/
public class TestcaseFactory extends PersistentObjectFactory {

private static Log logger = LogFactory.getLog(TestcaseFactory.class);

public TestcaseFactory(ClassLoader classLoader) {
 super(classLoader);
}

public Testcase getTestcase(String urlString) throws TestcaseException


{


 return this.getTestcaseFromUrl(urlString);
}

public Testcase getTestcaseFromDatabase(String urlString) throws TestcaseException {
Testcase testcase = null;
try {
if (!useExternalTransaction) {
db = PersistenceUtil.getDatabase(this.getClass().getClassLoader());
db.begin();
}
OQLQuery oql = db.getOQLQuery("SELECT tc FROM com.ibm.rfid.testcontroller.testcase.Testcase tc WHERE source = $1");
oql.bind(urlString);
QueryResults results = oql.execute();
logger.debug("Number of testcases: " + results.size());
while(results.hasMore()) {
testcase = (Testcase) results.next();
logger.debug("Number of testcase variables: " + testcase.getTestcaseVariables().size());
Vector variables = testcase.getTestcaseVariables();
for (Iterator iter = variables.iterator(); iter.hasNext(); ) {
TestcaseVariable variable = (TestcaseVariable) iter.next();
logger.debug (variable);
}
}
results.close();
if (!useExternalTransaction) {
db.commit();
}
}
catch (Throwable t) {
throw new TestcaseException(t);
}
finally {
if (!useExternalTransaction) {
try {
db.close();
}
catch (org.exolab.castor.jdo.PersistenceException e) {
logger.error("Error closing database: ", e);
}
}
}
return testcase;
}




----------------------------------------------------------------------------------------------


package com.ibm.rfid.testcontroller.testcase;

import junit.framework.Assert;
import junit.framework.TestCase;

/**
* @author Axel Mueller
*/
public class TestcaseFactoryTest extends TestCase {

/**
* Constructor for TestcaseTest.
* @param arg0
*/
public TestcaseFactoryTest(String arg0) {
 super(arg0);
}

public void testAll() throws Exception {
String url = "file:///c:/Program


Files/DeviceDeveloper5.6/workspace/SOMT_TestController/definitions/palettentest.xml";


TestcaseFactory factory = new TestcaseFactory(this.getClass().getClassLoader());
// Testcase testcase = factory.getTestcaseFromUrl(url);
// Assert.assertNotNull(testcase);
//
// factory.writeTestcaseToDatabase(testcase);
Testcase testcase = factory.getTestcaseFromDatabase(url);
Assert.assertNotNull(testcase);
Assert.assertEquals(2, testcase.getTestcaseVariables().size());
}
}




----------------------------------------------------------------------------------------------


package com.ibm.rfid.testcontroller.testcase;

import java.util.Iterator;
import java.util.Vector;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.exolab.castor.jdo.TimeStampable;

import com.ibm.rfid.testcontroller.PersistenceException;
import com.ibm.rfid.testcontroller.TestRun;

/**
* @author Axel Mueller
*/
public class Testcase implements TimeStampable {

private static Log logger = LogFactory.getLog(Testcase.class);

private Integer id;
private String source;
 private String description;
private long timeStamp;

//
// Begin Castor managed relations
//

private Vector testcaseVariables;
private Vector testRuns;

/**
* @return
*/
public Vector getTestcaseVariables() {
 return this.testcaseVariables;
}

/**
* @param vector
*/
public void setTestcaseVariables(Vector testcaseVariables) {
this.testcaseVariables = testcaseVariables;
if (testcaseVariables != null) {
Iterator itTestcaseVariables = this.testcaseVariables.iterator();
while (itTestcaseVariables.hasNext()) {
TestcaseVariable testcaseVariable = (TestcaseVariable) itTestcaseVariables.next();
testcaseVariable.setTestcase(this);
}
}
}


public Vector getTestRuns() {
 return this.testRuns;
}

/**
* @param vector
*/
public void setTestRuns(Vector testRuns) {
 this.testRuns = testRuns;
 Iterator itTestRuns = this.testRuns.iterator();
 while (itTestRuns.hasNext()) {
   TestRun testRun = (TestRun) itTestRuns.next();
   testRun.setTestcase(this);
 }
}

public TestRun createTestRun() throws PersistenceException {
 TestRun testRun = new TestRun();
 testRun.setTestcase(this);
 if (this.testRuns == null) {
   this.testRuns = new Vector();
 }
 this.testRuns.add(testRun);
 return testRun;
}

//
// End Castor managed relations
//

/**
* @return
*/
public Integer getId() {
 return this.id;
}

/**
* @param i
*/
public void setId(Integer id) {
 this.id = id;
}

 /**
  * @return
  */
 public String getSource() {
     return source;
 }

 /**
  * @param string
  */
 public void setSource(String string) {
     source = string;
 }

/**
* @return
*/
public String getDescription() {
 return description;
}

/**
* @param string
*/
public void setDescription(String string) {
 description = string;
}

/* (non-Javadoc)
* @see org.exolab.castor.jdo.TimeStampable#jdoSetTimeStamp(long)
*/
public void jdoSetTimeStamp(long timeStamp) {
 this.timeStamp = timeStamp;
}

/* (non-Javadoc)
* @see org.exolab.castor.jdo.TimeStampable#jdoGetTimeStamp()
*/
public long jdoGetTimeStamp() {
 return this.timeStamp;
}

 public String toString() {
     return " [ID] " + id + " [SOURCE] " + source + " [DESCRIPTION] "
+ description;
 }

}



----------------------------------------------------------------------------------------------


package com.ibm.rfid.testcontroller.testcase;

import org.exolab.castor.jdo.TimeStampable;


/** * @author Axel Mueller */ public class TestcaseVariable implements TimeStampable {

 private Integer id;
 private int testcaseId;
 private String label;
 private String description;
 private long timeStamp;



 //
 // Begin Castor managed relations
 //
private Testcase testcase;
 private ValueRange valueRange;

 /**
  * @return
  */
 public Testcase getTestcase() {
     return testcase;
 }

 /**
  * @param testcase
  */
 public void setTestcase(Testcase testcase) {
     this.testcase = testcase;
 }

 /**
  * @return
  */
 public ValueRange getValueRange() {
     return this.valueRange;
 }

 /**
  * @param vector
  */
 public void setValueRange(ValueRange valueRange) {
     this.valueRange = valueRange;
     valueRange.setTestcaseVariable(this);
 }

 //
 // End Castor managed relations
 //

 /**
  * @return
  */
 public int getId() {
     return this.id.intValue();
 }

 /**
  * @param i
  */
 public void setId(int id) {
     this.id = new Integer(id);
 }

 /**
  * @return
  */
 public int getTestcaseId() {
     return testcaseId;
 }

 /**
  * @param i
  */
 public void setTestcaseId(int testcaseId) {
     this.testcaseId = testcaseId;
 }

 /**
  * @return
  */
 public String getLabel() {
     return this.label;
 }

 /**
  * @param string
  */
 public void setLabel(String label) {
     this.label = label;
 }

 /**
  * @return
  */
 public String getDescription() {
     return this.description;
 }

 /**
  * @param string
  */
 public void setDescription(String description) {
     this.description = description;
 }

 public String toString() {
         return
                 " [ID] "
             + id
             + " [LABEL]"
             + label
             + " [DESCRIPTION] "
             + description;
     }

 /* (non-Javadoc)
  * @see org.exolab.castor.jdo.TimeStampable#jdoSetTimeStamp(long)
  */
 public void jdoSetTimeStamp(long timeStamp) {
     this.timeStamp = timeStamp;
 }

 /* (non-Javadoc)
  * @see org.exolab.castor.jdo.TimeStampable#jdoGetTimeStamp()
  */
 public long jdoGetTimeStamp() {
     return this.timeStamp;
 }
}

I would be happy if you could provide some hint to solve this problem


:-)


Axel











Isn't this 1:n relation thing a very basic feature for any O/R


mapping

tool?





Yes, it is, and it might as well turn out that the mistake is with


'you' ... configuration-wise or something else.







The only O/R tools I used myself are JBoss EJB 2.0 CMR and Object Relation Bridge.
However, I consider Castor a mature tool in this area ...






So would I, to be honest, despite some minor deficiencies.







and would expect problems rather on the user side than on the tool side. I choose


Castor

for this project since I need XML binding as well as O/R mapping.

The statements needed to replay the case:

CREATE TABLE `testcase` (
`id` int(10) unsigned NOT NULL default '0',
`source` varchar(255) default NULL,
`description` varchar(255) default NULL,
PRIMARY KEY  (`id`)
) TYPE=MyISAM;

#
# Dumping data for table `testcase`
#

INSERT INTO `testcase` VALUES (1, 'file:///c:/Program



Files/DeviceDeveloper5.6/workspace/SOMT_TestController/definitions/palettentest.xml',












'Einfluss der Geschwindigkeit des Palettendurchgangs');






CREATE TABLE `testcase_variable` (
`id` int(10) unsigned NOT NULL default '0',
`testcase_id` int(10) unsigned NOT NULL default '0',
`label` varchar(20) default NULL,
`description` varchar(255) default NULL,
PRIMARY KEY  (`id`),
KEY `testcase_variable_FKIndex1` (`testcase_id`)
) TYPE=MyISAM;

#
# Dumping data for table `testcase_variable`
#

INSERT INTO `testcase_variable` VALUES (1, 1, 'Geschwindigkeit',


'Palettengeschwindigkeit');


INSERT INTO `testcase_variable` VALUES (2, 1, 'Versuch', 'Versuch');



About iteration: I forgot to mention it in my original post but I


was

surprised to see that results.size() is 2 but only ONE iteration is performed using a similar code snipped like below.
After digging around I turned caching off yesterday already (prior my
post) but the behaviour was still the same.
Anyway - below is the snippet's output you asked for:



2004-08-07 09:01:55,366 DEBUG [main] engine.KeyGeneratorRegistry (KeyGeneratorRegistry.java:114) - Key generator MAX has been instantiated, parameters: {}
2004-08-07 09:01:55,496 DEBUG [main] engine.SQLEngine (SQLEngine.java:1221) - Creating class: com.ibm.rfid.testcontroller.testcase.Testcase using SQL: INSERT INTO testcase (id,source,description) VALUES (?,?,?)
2004-08-07 09:01:55,496 DEBUG [main] engine.SQLEngine (SQLEngine.java:1229) - Removing class: com.ibm.rfid.testcontroller.testcase.Testcase using SQL: DELETE FROM testcase WHERE id=?
2004-08-07 09:01:55,496 DEBUG [main] engine.SQLEngine (SQLEngine.java:1262) - Updating class: com.ibm.rfid.testcontroller.testcase.Testcase using SQL: UPDATE


testcase

SET source=?,description=? WHERE id=? AND source=? AND description=?
2004-08-07 09:01:55,506 DEBUG [main] engine.SQLEngine (SQLEngine.java:1336) - Loading class: com.ibm.rfid.testcontroller.testcase.Testcase using SQL: SELECT testcase_variable.id,testcase.source,testcase.description FROM


testcase

LEFT OUTER JOIN testcase_variable ON testcase.id=testcase_variable.testcase_id WHERE testcase.id=?
2004-08-07 09:01:55,576 DEBUG [main] engine.SQLEngine (SQLEngine.java:1221) - Creating class: com.ibm.rfid.testcontroller.testcase.TestcaseVariable using SQL:


INSERT

INTO testcase_variable (id,testcase_id,label,description) VALUES


(?,?,?,?)


2004-08-07 09:01:55,576 DEBUG [main] engine.SQLEngine (SQLEngine.java:1229) - Removing class: com.ibm.rfid.testcontroller.testcase.TestcaseVariable using SQL:


DELETE





FROM testcase_variable WHERE id=?






2004-08-07 09:01:55,576 DEBUG [main] engine.SQLEngine (SQLEngine.java:1262) - Updating class: com.ibm.rfid.testcontroller.testcase.TestcaseVariable using SQL:


UPDATE

testcase_variable SET testcase_id=?,label=?,description=? WHERE id=?


AND

testcase_id=? AND label=? AND description=?
2004-08-07 09:01:55,576 DEBUG [main] engine.SQLEngine (SQLEngine.java:1336) - Loading class: com.ibm.rfid.testcontroller.testcase.TestcaseVariable using SQL:


SELECT



testcase_variable.testcase_id,variable_value_range.id,testcase_variable.label,testcase_variable.description






FROM testcase_variable LEFT OUTER JOIN variable_value_range ON






testcase_variable.id=variable_value_range.id WHERE


testcase_variable.id=?


2004-08-07 09:01:55,576 DEBUG [main] engine.SQLEngine (SQLEngine.java:1221) - Creating class: com.ibm.rfid.testcontroller.testcase.ValueRange using SQL: INSERT


INTO

variable_value_range (id,testcase_variable_id,minValue,maxValue,increment,unit) VALUES (?,?,?,?,?,?)
2004-08-07 09:01:55,586 DEBUG [main] engine.SQLEngine (SQLEngine.java:1229) - Removing class: com.ibm.rfid.testcontroller.testcase.ValueRange using SQL: DELETE


FROM

variable_value_range WHERE id=?
2004-08-07 09:01:55,586 DEBUG [main] engine.SQLEngine (SQLEngine.java:1262) - Updating class: com.ibm.rfid.testcontroller.testcase.ValueRange using SQL: UPDATE variable_value_range SET testcase_variable_id=?,minValue=?,maxValue=?,increment=?,unit=? WHERE
id=? AND testcase_variable_id=? AND minValue=? AND maxValue=? AND increment=? AND unit=?
2004-08-07 09:01:55,586 DEBUG [main] engine.SQLEngine (SQLEngine.java:1336) - Loading class: com.ibm.rfid.testcontroller.testcase.ValueRange using SQL: SELECT






variable_value_range.testcase_variable_id,variable_value_range.minValue,variable_value_range.maxValue,variable_value_range.increment,variable












_value_range.unit

FROM variable_value_range WHERE variable_value_range.id=?






2004-08-07 09:01:55,626 DEBUG [main] cache.CacheFactory (CacheFactory.java:128) - Creating cache instance for type none
2004-08-07 09:01:55,636 DEBUG [main] cache.CacheFactory (CacheFactory.java:128) - Creating cache instance for type none
2004-08-07 09:01:55,636 DEBUG [main] cache.CacheFactory (CacheFactory.java:128) - Creating cache instance for type none
2004-08-07 09:01:55,837 DEBUG [main] engine.SQLEngine (SQLEngine.java:384) - Create SQL: SELECT testcase.id,testcase_variable.id,testcase.source,testcase.description




FROM testcase LEFT OUTER JOIN testcase_variable ON






testcase.id=testcase_variable.testcase_id WHERE (testcase.source = ?)
2004-08-07 09:01:57,099 DEBUG [main] engine.SQLEngine$SQLQuery (SQLEngine.java:1699) - jdo.executing
2004-08-07 09:01:57,289 DEBUG [main] testcase.TestcaseFactory (TestcaseFactory.java:58) - Number of testcases: 2
2004-08-07 09:01:57,309 DEBUG [main] cache.NoCache (NoCache.java:122)


-

Removing cache entry for key


com.ibm.rfid.testcontroller.testcase.Testcase/1


2004-08-07 09:01:57,339 DEBUG [main] cache.NoCache (NoCache.java:122)


-

Removing cache entry for key com.ibm.rfid.testcontroller.testcase.TestcaseVariable/1
2004-08-07 09:01:57,339 DEBUG [main] engine.SQLEngine (SQLEngine.java:1020) - Loading class: com.ibm.rfid.testcontroller.testcase.TestcaseVariable using SQL:


SELECT



testcase_variable.testcase_id,variable_value_range.id,testcase_variable.label,testcase_variable.description






FROM testcase_variable LEFT OUTER JOIN variable_value_range ON






testcase_variable.id=variable_value_range.id WHERE


testcase_variable.id=?


2004-08-07 09:01:57,369 DEBUG [main] cache.NoCache (NoCache.java:122)


-

Removing cache entry for key com.ibm.rfid.testcontroller.testcase.ValueRange/1
2004-08-07 09:01:57,369 DEBUG [main] engine.SQLEngine (SQLEngine.java:1020) - Loading class: com.ibm.rfid.testcontroller.testcase.ValueRange using SQL: SELECT






variable_value_range.testcase_variable_id,variable_value_range.minValue,variable_value_range.maxValue,variable_value_range.increment,variable












_value_range.unit

FROM variable_value_range WHERE variable_value_range.id=?






2004-08-07 09:01:57,399 DEBUG [main] persist.LockEngine (LockEngine.java:370) - Loading class: com.ibm.rfid.testcontroller.testcase.ValueRange with id: 1
2004-08-07 09:01:57,399 DEBUG [main] persist.LockEngine (LockEngine.java:370) - Loading class: com.ibm.rfid.testcontroller.testcase.TestcaseVariable with id: 1
2004-08-07 09:01:57,409 DEBUG [main] persist.LockEngine (LockEngine.java:370) - Loading class: com.ibm.rfid.testcontroller.testcase.Testcase with id: 1
2004-08-07 09:01:57,409 DEBUG [main] testcase.TestcaseFactory (TestcaseFactory.java:61) - Number of testcase variables: 1
2004-08-07 09:01:57,409 DEBUG [main] testcase.TestcaseFactory (TestcaseFactory.java:65) - [ID] 1 [LABEL]Geschwindigkeit


[DESCRIPTION]

Palettengeschwindigkeit
2004-08-07 09:01:57,419 DEBUG [main] persist.ObjectLock (ObjectLock.java:821) - Release com.ibm.rfid.testcontroller.testcase.Testcase/1/0 R/- by [EMAIL PROTECTED]
2004-08-07 09:01:57,419 DEBUG [main] cache.NoCache (NoCache.java:93)


-

Creating cache entry for key com.ibm.rfid.testcontroller.testcase.Testcase/1 with value com.ibm.rfid.testcontroller.testcase.Testcase/1/0 -/-
2004-08-07 09:01:57,419 DEBUG [main] cache.NoCache (NoCache.java:157)


-

Disposing object com.ibm.rfid.testcontroller.testcase.Testcase/1/0


-/-


2004-08-07 09:01:57,419 DEBUG [main] persist.ObjectLock (ObjectLock.java:821) - Release com.ibm.rfid.testcontroller.testcase.TestcaseVariable/1/1 R/- by [EMAIL PROTECTED]
2004-08-07 09:01:57,429 DEBUG [main] cache.NoCache (NoCache.java:93)


-

Creating cache entry for key com.ibm.rfid.testcontroller.testcase.TestcaseVariable/1 with value com.ibm.rfid.testcontroller.testcase.TestcaseVariable/1/1 -/-
2004-08-07 09:01:57,429 DEBUG [main] cache.NoCache (NoCache.java:157)


-

Disposing object com.ibm.rfid.testcontroller.testcase.TestcaseVariable/1/1 -/-
2004-08-07 09:01:57,429 DEBUG [main] persist.ObjectLock (ObjectLock.java:821) - Release com.ibm.rfid.testcontroller.testcase.ValueRange/1/2 R/- by [EMAIL PROTECTED]
2004-08-07 09:01:57,429 DEBUG [main] cache.NoCache (NoCache.java:93)


-

Creating cache entry for key com.ibm.rfid.testcontroller.testcase.ValueRange/1 with value com.ibm.rfid.testcontroller.testcase.ValueRange/1/2 -/-
2004-08-07 09:01:57,439 DEBUG [main] cache.NoCache (NoCache.java:157)


-

Disposing object com.ibm.rfid.testcontroller.testcase.ValueRange/1/2


-/-


Still hoping to solve the problem ;-)

Axel


Werner Guttmann wrote:







Axel,

can you please post the DDL you used to create the testcase and


testcase_variable tables. I'd like to be able to replay what you've
experienced.


Just out of curiosity, if you iterated through all


testCaseVariables, do you at least get all of them returned ? Iow, if you


changed

OQLQuery oql = db.getOQLQuery("SELECT tc FROM


com.ibm.rfid.testcontroller.testcase.Testcase tc WHERE source = $1");


oql.bind(urlString);
QueryResults results = oql.execute();
logger.debug("Number of testcases: " + results.size());
while(results.hasMore()) {
testcase = (Testcase) results.next();
logger.debug("Number of testcase variables: " +


testcase.getTestcaseVariables().size());


Vector variables = testcase.getTestCaseVariables();
for (Iterator iter = variables.iterator(); iter.hasNext(); ) {
  TestCaseVariable variable = (TestCaseVariable) iter.next();
  logger.debug (variable);
}
}

what's the output ?

Werner

On Fri, 06 Aug 2004 18:20:54 +0200, Axel Mueller wrote:









Hi,

For two tables "testcase" (class Testcase) and "testcase_variable" (class TestcaseVariable) I have defined a 1:n relation and perform


a

OQLQuery on the "1" side of that relation (which is Testcase).
Table "testcase" contains only one row whereas the table "testcase_variables" contains 2 rows whose foreign key matches the primary key of the row in "testcase":


mysql> select id from testcase;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

mysql> select * from testcase_variable;
+----+-------------+-----------------+-------------------------+
| id | testcase_id | label           | description             |
+----+-------------+-----------------+-------------------------+
|  1 |           1 | Geschwindigkeit | Palettengeschwindigkeit |
|  2 |           1 | Versuch         | Versuch                 |
+----+-------------+-----------------+-------------------------+

I would expect the query below to return ONE Testcase object and


the

testcase object to contain TWO TestcaseVariable objects.
Actually results.size() returns 2 and testcase.getTestcaseVariables().size() returns 1 - exactly the


opposite

of what I would have expected.
What am I doing wrong??? I found some examples of 1:n relations but


I'm

doing the query the same way the do using the same kind of mapping


to

express the 1:n relation.


OQLQuery oql = db.getOQLQuery("SELECT tc FROM com.ibm.rfid.testcontroller.testcase.Testcase tc WHERE source =


$1");


oql.bind(urlString);
QueryResults results = oql.execute();
logger.debug("Number of testcases: " + results.size());
while(results.hasMore()) {
testcase = (Testcase) results.next();
logger.debug("Number of testcase variables: " + testcase.getTestcaseVariables().size());
}



The relevant section of the mapping descriptor looks like this:

<class name="com.ibm.rfid.testcontroller.testcase.Testcase" identity="id" key-generator="MAX">
<cache-type type="none"/>
<map-to table="testcase" xml="testcase"/>
<field name="testcaseVariables" type="com.ibm.rfid.testcontroller.testcase.TestcaseVariable" collection="vector">
<sql many-key="testcase_id"/>
<bind-xml name="testcase-variable" node="element"/>
</field>
<!-- field name="testRuns" type="com.ibm.rfid.testcontroller.TestRun" collection="vector">
<sql many-key="testcase_id"/>
<bind-xml name="testcase-run" node="element"/>
</field -->
<field name="id">
<sql name="id"/>
<bind-xml name="id" node="attribute"/>
</field>
<field name="source">
<sql name="source"/>
<bind-xml name="source" node="attribute"/>
</field>
<field name="description">
<sql name="description"/>
<bind-xml name="description" node="attribute"/>
</field>
</class>


<class


name="com.ibm.rfid.testcontroller.testcase.TestcaseVariable"

identity="id" key-generator="MAX">
<cache-type type="none"/>
<map-to table="testcase_variable" xml="testcase-variable"/>
<field name="testcase" type="com.ibm.rfid.testcontroller.testcase.Testcase">
<sql name="testcase_id" />
<bind-xml name="testcase-id" node="element"


reference="true"/>


</field>
<field name="valueRange" type="com.ibm.rfid.testcontroller.testcase.ValueRange">
<bind-xml name="value-range" node="element"/>
</field>
<field name="id">
<sql name="id"/>
<bind-xml name="id" node="attribute"/>
</field>
<field name="label">
<sql name="label"/>
<bind-xml name="label" node="attribute"/>
</field>
<field name="description">
<sql name="description"/>
<bind-xml name="description" node="attribute"/>
</field>
</class>




Below is the logging of the query code snipped above:


2004-08-06 17:38:30,989 DEBUG [main] engine.SQLEngine (SQLEngine.java:384) - Create SQL: SELECT


testcase.id,testcase_variable.id,testcase.source,testcase.description








FROM testcase LEFT OUTER JOIN testcase_variable ON








testcase.id=testcase_variable.testcase_id WHERE (testcase.source =


?)


2004-08-06 17:38:31,380 DEBUG [main] engine.SQLEngine$SQLQuery (SQLEngine.java:1699) - jdo.executing
2004-08-06 17:38:31,410 DEBUG [main] testcase.TestcaseFactory (TestcaseFactory.java:57) - Number of testcases: 2
2004-08-06 17:38:31,420 DEBUG [main] cache.NoCache


(NoCache.java:122) -

Removing cache entry for key


com.ibm.rfid.testcontroller.testcase.Testcase/1


2004-08-06 17:38:31,450 DEBUG [main] cache.NoCache


(NoCache.java:122) -

Removing cache entry for key com.ibm.rfid.testcontroller.testcase.TestcaseVariable/1
2004-08-06 17:38:31,450 DEBUG [main] engine.SQLEngine (SQLEngine.java:1020) - Loading class: com.ibm.rfid.testcontroller.testcase.TestcaseVariable using SQL:


SELECT



testcase_variable.testcase_id,variable_value_range.id,testcase_variable.label,testcase_variable.description








FROM testcase_variable LEFT OUTER JOIN variable_value_range ON








testcase_variable.id=variable_value_range.id WHERE


testcase_variable.id=?


2004-08-06 17:38:31,460 DEBUG [main] cache.NoCache


(NoCache.java:122) -

Removing cache entry for key com.ibm.rfid.testcontroller.testcase.ValueRange/1
2004-08-06 17:38:31,460 DEBUG [main] engine.SQLEngine (SQLEngine.java:1020) - Loading class: com.ibm.rfid.testcontroller.testcase.ValueRange using SQL: SELECT








variable_value_range.testcase_variable_id,variable_value_range.minValue,variable_value_range.maxValue,variable_value_range.increment,variable


















_value_range.unit

FROM variable_value_range WHERE variable_value_range.id=?








2004-08-06 17:38:31,470 DEBUG [main] persist.LockEngine (LockEngine.java:370) - Loading class: com.ibm.rfid.testcontroller.testcase.ValueRange with id: 1
2004-08-06 17:38:31,470 DEBUG [main] persist.LockEngine (LockEngine.java:370) - Loading class: com.ibm.rfid.testcontroller.testcase.TestcaseVariable with id: 1
2004-08-06 17:38:31,470 DEBUG [main] persist.LockEngine (LockEngine.java:370) - Loading class: com.ibm.rfid.testcontroller.testcase.Testcase with id: 1
2004-08-06 17:38:31,490 DEBUG [main] testcase.TestcaseFactory (TestcaseFactory.java:60) - Number of testcase variables: 1
2004-08-06 17:38:31,500 DEBUG [main] persist.ObjectLock (ObjectLock.java:821) - Release com.ibm.rfid.testcontroller.testcase.Testcase/1/0 R/- by [EMAIL PROTECTED]
2004-08-06 17:38:31,500 DEBUG [main] cache.NoCache


(NoCache.java:93) -

Creating cache entry for key com.ibm.rfid.testcontroller.testcase.Testcase/1 with value com.ibm.rfid.testcontroller.testcase.Testcase/1/0 -/-
2004-08-06 17:38:31,510 DEBUG [main] cache.NoCache


(NoCache.java:157) -

Disposing object com.ibm.rfid.testcontroller.testcase.Testcase/1/0


-/-


2004-08-06 17:38:31,510 DEBUG [main] persist.ObjectLock (ObjectLock.java:821) - Release com.ibm.rfid.testcontroller.testcase.TestcaseVariable/1/1 R/- by [EMAIL PROTECTED]
2004-08-06 17:38:31,510 DEBUG [main] cache.NoCache


(NoCache.java:93) -

Creating cache entry for key com.ibm.rfid.testcontroller.testcase.TestcaseVariable/1 with value com.ibm.rfid.testcontroller.testcase.TestcaseVariable/1/1 -/-
2004-08-06 17:38:31,520 DEBUG [main] cache.NoCache


(NoCache.java:157) -

Disposing object com.ibm.rfid.testcontroller.testcase.TestcaseVariable/1/1 -/-
2004-08-06 17:38:31,520 DEBUG [main] persist.ObjectLock (ObjectLock.java:821) - Release com.ibm.rfid.testcontroller.testcase.ValueRange/1/2 R/- by [EMAIL PROTECTED]
2004-08-06 17:38:31,520 DEBUG [main] cache.NoCache


(NoCache.java:93) -

Creating cache entry for key com.ibm.rfid.testcontroller.testcase.ValueRange/1 with value com.ibm.rfid.testcontroller.testcase.ValueRange/1/2 -/-
2004-08-06 17:38:31,520 DEBUG [main] cache.NoCache


(NoCache.java:157) -

Disposing object


com.ibm.rfid.testcontroller.testcase.ValueRange/1/2 -/-



----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user










----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user











----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user








----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user









----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user






----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user







----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user








----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user










----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user

Reply via email to