Hello,

i encountered the following exception while using castor 1.1 on an Oracle 10g 
database:

SCHWERWIEGEND (= fatal): A fatal error occurred while loading 
de.hbo.test.castor3.ClassB using SQL: SELECT "CLASSC1"."ID","CLASSC2"."ID" FROM 
"CLASSB","CLASSC2","CLASSC1" WHERE "CLASSB"."ID"="CLASSC1"."ID"(+) AND 
"CLASSB"."ID"="CLASSC2"."ID"(+) AND "CLASSB"."ID"=?
java.sql.SQLException: Ungültiger Spaltenindex (=invalid column index)
 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:207)
 at 
oracle.jdbc.driver.OracleResultSetImpl.getObject(OracleResultSetImpl.java:896)
 at org.castor.jdo.engine.SQLTypeInfos.getValue(SQLTypeInfos.java:265)
 at 
org.exolab.castor.jdo.engine.SQLHelper.calculateNumberOfFields(SQLHelper.java:73)
 at 
org.exolab.castor.jdo.engine.SQLStatementLoad.executeStatement(SQLStatementLoad.java:304)
 at org.exolab.castor.jdo.engine.SQLEngine.load(SQLEngine.java:349)
 at org.exolab.castor.persist.ClassMolder.loadFields(ClassMolder.java:565)
 at org.exolab.castor.persist.ClassMolder.load(ClassMolder.java:614)
 at org.exolab.castor.persist.LockEngine.load(LockEngine.java:396)
 at 
org.castor.persist.AbstractTransactionContext.load(AbstractTransactionContext.java:568)
 at 
org.castor.persist.AbstractTransactionContext.load(AbstractTransactionContext.java:431)
 at 
org.castor.persist.resolver.PersistanceCapableRelationResolver.load(PersistanceCapableRelationResolver.java:432)
 at org.exolab.castor.persist.ClassMolder.load(ClassMolder.java:638)
 at org.exolab.castor.persist.LockEngine.load(LockEngine.java:396)
 at 
org.castor.persist.AbstractTransactionContext.load(AbstractTransactionContext.java:568)
 at 
org.castor.persist.AbstractTransactionContext.load(AbstractTransactionContext.java:431)
 at 
org.exolab.castor.jdo.engine.AbstractDatabaseImpl.load(AbstractDatabaseImpl.java:301)
 at 
org.exolab.castor.jdo.engine.AbstractDatabaseImpl.load(AbstractDatabaseImpl.java:248)
 at de.hbo.test.castor3.TestAppl.start(TestAppl.java:32)
 at de.hbo.test.castor3.TestAppl.main(TestAppl.java:14)


As far as i could see at 
org.castor.jdo.engine.SQLTypeInfos.getValue(SQLTypeInfos.java:265) Castor's 
trying to access the third column of the resultset of the SQL-statement above, 
which of course isn't there.


my mapping:


     <class name="de.hbo.test.castor3.ClassA" identity="id">
       
      <map-to table="CLASSA" />
         
         <field name="id" type="integer" >
           <sql name="id" type="integer" />
         </field>
         
         <field name="mother" type="de.hbo.test.castor3.ClassB" >
           <sql name="motherid"/>
         </field>
         
         <field name="father" type="de.hbo.test.castor3.ClassB" >
           <sql name="fatherid"/>
         </field>
     </class>
     
     <class name="de.hbo.test.castor3.ClassB" identity="id">
       
         <map-to table="CLASSB" />
         
         <field name="id" type="integer" >
           <sql name="id" type="integer" />
         </field>
     </class>
     
     <class name="de.hbo.test.castor3.ClassC1" identity="id" 
extends="de.hbo.test.castor3.ClassB">
       
         <map-to table="CLASSC1" />
         
         <field name="id" type="integer" >
           <sql name="id" type="integer" />
         </field>
     </class>
     
     <class name="de.hbo.test.castor3.ClassC2" identity="id" 
extends="de.hbo.test.castor3.ClassB">
       
      <map-to table="CLASSC2" />
         
         <field name="id" type="integer" >
           <sql name="id" type="integer" />
         </field>
     </class>
    



my database entries:

     select * from classa;
    
             ID   MOTHERID   FATHERID
     ---------- ---------- ----------
              1          1          2
    
    
    
     select * from classb;
    
             ID
     ----------
              1
              2
    
    
    
     select * from classc1;
     
             ID
     ----------
              1
    


     select * from classc2;
    
             ID
     ----------
              2
    
    
    
    
    
my source code:

     ...
    
     Database db = jdoManager.getDatabase();
        
     db.begin();
    
     ClassA klasse = (ClassA)db.load(ClassA.class, new Integer(1));
    
     db.commit();





Changing the mapping of ClassA as follows, everything works just fine:

    <class name="de.hbo.test.castor3.ClassA" identity="id">
    
         ...
         
         <field name="mother" type="de.hbo.test.castor3.ClassC1" >
           <sql name="motherid"/>
         </field>
         
         <field name="father" type="de.hbo.test.castor3.ClassC2 >
           <sql name="fatherid"/>
         </field>
    
     </class>


Thanks in advance,
Hubert.

Reply via email to