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
IWerner,
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:
classes to get this to compiel and run correctly. Here's a list of classesAxel,
just looking at your problem right now, but it seems I still need some
seem to bechanged
mistakes so far, it could equally be that there is ... hence my desire tomissing:
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:
Well, actually, this is not the case. Whilst I have not spotted anyWerner,
Thanks for your reply! From your post I conclude that there is no obvious mistake I made.
'replay' your
classes as well ?scenario. Speaking of which, could be you please post your Java
{----------------------------------------------------------------------------------------------
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;
}
Files/DeviceDeveloper5.6/workspace/SOMT_TestController/definitions/palettentest.xml";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
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
mappingAxel
Isn't this 1:n relation thing a very basic feature for any O/R
'you' ... configuration-wise or something else.tool?Yes, it is, and it might as well turn out that the mistake is with
Castor
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
Files/DeviceDeveloper5.6/workspace/SOMT_TestController/definitions/palettentest.xml',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
'Palettengeschwindigkeit');
'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',
wasINSERT INTO `testcase_variable` VALUES (2, 1, 'Versuch', 'Versuch');
About iteration: I forgot to mention it in my original post but I
testcasesurprised 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
testcaseSET 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
INSERTLEFT 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:
(?,?,?,?)INTO testcase_variable (id,testcase_id,label,description) VALUES
DELETE2004-08-07 09:01:55,576 DEBUG [main] engine.SQLEngine (SQLEngine.java:1229) - Removing class: com.ibm.rfid.testcontroller.testcase.TestcaseVariable using SQL:
UPDATE
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:
ANDtestcase_variable SET testcase_id=?,label=?,description=? WHERE id=?
SELECTtestcase_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:
testcase_variable.id=?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
INTO2004-08-07 09:01:55,576 DEBUG [main] engine.SQLEngine (SQLEngine.java:1221) - Creating class: com.ibm.rfid.testcontroller.testcase.ValueRange using SQL: INSERT
FROMvariable_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
-variable_value_range.testcase_variable_id,variable_value_range.minValue,variable_value_range.maxValue,variable_value_range.increment,variablevariable_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
_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)
com.ibm.rfid.testcontroller.testcase.Testcase/1Removing cache entry for key
-2004-08-07 09:01:57,339 DEBUG [main] cache.NoCache (NoCache.java:122)
SELECTRemoving 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:
testcase_variable.id=?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
-2004-08-07 09:01:57,369 DEBUG [main] cache.NoCache (NoCache.java:122)
[DESCRIPTION]variable_value_range.testcase_variable_id,variable_value_range.minValue,variable_value_range.maxValue,variable_value_range.increment,variableRemoving 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
_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
-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
testcase_variable tables. I'd like to be able to replay what you'veStill hoping to solve the problem ;-)
Axel
Werner Guttmann wrote:
Axel,
can you please post the DDL you used to create the testcase and
experienced.
testCaseVariables, do you at least get all of them returned ? Iow, if youJust out of curiosity, if you iterated through all
com.ibm.rfid.testcontroller.testcase.Testcase tc WHERE source = $1");OQLQuery oql = db.getOQLQuery("SELECT tc FROM
testcase.getTestcaseVariables().size());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: " +
aVector 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
theOQLQuery 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
oppositetestcase object to contain TWO TestcaseVariable objects.
Actually results.size() returns 2 and testcase.getTestcaseVariables().size() returns 1 - exactly the
I'mof what I would have expected.
What am I doing wrong??? I found some examples of 1:n relations but
todoing the query the same way the do using the same kind of mapping
$1");express the 1:n relation.
OQLQuery oql = db.getOQLQuery("SELECT tc FROM com.ibm.rfid.testcontroller.testcase.Testcase tc WHERE source =
name="com.ibm.rfid.testcontroller.testcase.TestcaseVariable"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
reference="true"/>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"
?)</field>testcase.id,testcase_variable.id,testcase.source,testcase.description
<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
FROM testcase LEFT OUTER JOIN testcase_variable ON
testcase.id=testcase_variable.testcase_id WHERE (testcase.source =
(NoCache.java:122) -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
com.ibm.rfid.testcontroller.testcase.Testcase/1Removing cache entry for key
(NoCache.java:122) -2004-08-06 17:38:31,450 DEBUG [main] cache.NoCache
SELECTRemoving 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:
testcase_variable.id=?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
(NoCache.java:122) -2004-08-06 17:38:31,460 DEBUG [main] cache.NoCache
(NoCache.java:93) -variable_value_range.testcase_variable_id,variable_value_range.minValue,variable_value_range.maxValue,variable_value_range.increment,variableRemoving 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
_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:157) -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
-/-Disposing object com.ibm.rfid.testcontroller.testcase.Testcase/1/0
(NoCache.java:93) -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:157) -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:93) -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:157) -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
com.ibm.rfid.testcontroller.testcase.ValueRange/1/2 -/-Disposing object
----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-user
[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
