Hello

When I iterate through QueryResults and change a property with its setter
methode I get ObjectModifiedException at db.Commit. This happens for all
records/objects of QueryResult except the last one, where it works as
expected (value is changed after commit).

Is there something wrong with my code, the libs I use or is there a bug in
castor ???


environment:

on remote linux machine:
    oracle 8.0.6 database server

on windows 2000 workstation:
    j2sdk-1.3.1
    oracle JDBC driver 9.0.1
    xerces 1.4.4
    castor 0.9.4.1


table definition:

CREATE TABLE TBL_STP_FAMILIE

             PFAM_ID                        NUMBER   ( 10, 0)     NULL,
             PFAM_KURZ                      VARCHAR2 (    25)     NULL,
             PFAM_TEXT                      VARCHAR2 (    50)     NULL )
TABLESPACE TBL_FIM1_PPT


mapping.xml:

<!DOCTYPE databases PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN"
                           "http://castor.exolab.org/mapping.dtd";>
<mapping>

    <key-generator name="SEQUENCE">
        <param name="trigger" value="true"/>
        <param name="returning" value="true"/>
    </key-generator>

<!-- Mapping for 'ProduktFamilie' -->
    <class name="ProduktFamilie" identity="id" key-generator="SEQUENCE">
        <description>Produktfamilie</description>
        <map-to table="TBL_STP_FAMILIE" />
        <field name="id" type="integer" >
            <sql name="PFAM_ID" type="numeric"/>
        </field>
        <field name="kurz" type="string">
            <sql name="PFAM_KURZ" type="varchar" />
        </field>
        <field name="text" type="string">
            <sql name="PFAM_TEXT" type="varchar" />
        </field>
    </class>

</mapping>


code of ProduktFamilie:

public class ProduktFamilie
{
    private int       _id;
    private String    _kurz;
    private String    _text;

    public int getId() { return _id; }
    public void setId( int id ) { _id = id; }

    public String getKurz() { return _kurz; }
    public void setKurz( String kurz ) { _kurz = kurz; }

    public String getText() { return _text; }
    public void setText( String text ) { _text = text; }

    public String toString()
    {
        return "<id: " + _id + " kurz: " + _kurz + " text: " + _text + ">";
    }
}


example code:

import ProduktFamilie;

import java.io.PrintWriter;

import org.exolab.castor.jdo.JDO;
import org.exolab.castor.jdo.Database;
import org.exolab.castor.jdo.OQLQuery;
import org.exolab.castor.jdo.QueryResults;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.util.Logger;

public class CastorCheckup
{
    public static final String DatabaseFile = "database.xml";
    public static final String MappingFile = "mapping.xml";

    private Mapping  _mapping;
    private JDO      _jdo;

    public static void main( String[] args )
    {
        PrintWriter   writer;
        CastorCheckup cc;

        writer = new Logger( System.out ).setPrefix( "CastorCheckup" );
        try
        {
            cc = new CastorCheckup( writer );
            cc.run( writer );
        }
        catch ( Exception except )
        {
            writer.println( except );
            except.printStackTrace( writer );
        }
    }


    public CastorCheckup( PrintWriter writer )
        throws Exception
    {
        // Load the mapping file
        _mapping = new Mapping( getClass().getClassLoader() );
        _mapping.setLogWriter( writer );
        _mapping.loadMapping( getClass().getResource( MappingFile ) );

        _jdo = new JDO();
        _jdo.setLogWriter( writer );







 _jdo.setConfiguration( getClass().getResource( DatabaseFile ).toString() );
        _jdo.setDatabaseName( "test" );
    }


    public void run( PrintWriter writer )
        throws Exception
    {
        Database        db;
        ProduktFamilie  pfam;
        OQLQuery        pfamOql;
        QueryResults    results;

        db = _jdo.getDatabase();

        db.begin();
        writer.println( "Begin transaction to query 'ProduktFamilie'
objects" );

        // Look up all records of 'ProduktFamilie'
        pfamOql = db.getOQLQuery( "SELECT pf FROM ProduktFamilie pf ORDER BY
pf.kurz" );
        results = pfamOql.execute();

        while ( results.hasMore() )
        {
                pfam = ( ProduktFamilie ) results.next();
                writer.println( "Found 'ProduktFamilie': " + pfam );

                if (pfam.getId() == 64) { pfam.setText(pfam.getText() +
"x"); }              // update
        }

        writer.println( "End transaction to query 'ProduktFamilie'
objects" );
        db.commit();

        db.close();
        writer.println( "CastorCheckup complete" );
    }
}


Output:

[CastorCheckup] Loading mapping descriptors from
file:/C:/Java/project/castorcheckup/mapping.xml
[CastorCheckup] Key generator SEQUENCE has been instantiated, parameters:
{trigger=true, returning=true}
[CastorCheckup] SQL for creating ProduktFamilie: {call INSERT INTO
"TBL_STP_FAMILIE" ("PFAM_KURZ","PFAM_TEXT") VALUES (?,?) RETURNING "PFAM_ID"
INTO ?}
[CastorCheckup] SQL for deleting ProduktFamilie: DELETE FROM
"TBL_STP_FAMILIE" WHERE "PFAM_ID"=?
[CastorCheckup] SQL for updating ProduktFamilie: UPDATE "TBL_STP_FAMILIE"
SET "PFAM_KURZ"=?,"PFAM_TEXT"=? WHERE "PFAM_ID"=? AND "PFAM_KURZ"=? AND
"PFAM_TEXT"=?
[CastorCheckup] SQL for loading ProduktFamilie:  SELECT
"TBL_STP_FAMILIE"."PFAM_KURZ","TBL_STP_FAMILIE"."PFAM_TEXT" FROM
"TBL_STP_FAMILIE" WHERE "TBL_STP_FAMILIE"."PFAM_ID"=?
[CastorCheckup] Begin transaction to query 'ProduktFamilie' objects
[CastorCheckup] SELECT
"TBL_STP_FAMILIE"."PFAM_ID","TBL_STP_FAMILIE"."PFAM_KURZ","TBL_STP_FAMILIE".
"PFAM_TEXT","TBL_STP_FAMILIE"."PFAM_RUECK","TBL_STP_FAMILIE"."PFAM_INFO","TB
L_STP_FAMILIE"."PFAM_UPD","TBL_STP_FAMILIE"."PFAM_UPM" FROM
"TBL_STP_FAMILIE" ORDER BY "TBL_STP_FAMILIE"."PFAM_KURZ"
[CastorCheckup] Castor: Loading ProduktFamilie (1)
[CastorCheckup] Found 'ProduktFamilie': <id: 1 kurz: CA text: CA>
.....
[CastorCheckup] Castor: Loading ProduktFamilie (64)
[CastorCheckup] Found 'ProduktFamilie': <id: 64 kurz: SJ text: SJ>
[CastorCheckup] Castor: Loading ProduktFamilie (15)
[CastorCheckup] Found 'ProduktFamilie': <id: 15 kurz: U5 text: U5>
[CastorCheckup] End transaction to query 'ProduktFamilie' objects
[CastorCheckup] Castor: Storing ProduktFamilie (64)
[CastorCheckup] org.exolab.castor.jdo.ObjectModifiedException: Transaction
aborted: Object of type ProduktFamilie with identity 64 has been modified by
a concurrent transaction
[CastorCheckup] org.exolab.castor.jdo.ObjectModifiedException: Transaction
aborted: Object of type ProduktFamilie with identity 64 has been modified by
a concurrent transaction
[CastorCheckup]         at
org.exolab.castor.jdo.engine.SQLEngine.store(Unknown Source)
[CastorCheckup]         at
org.exolab.castor.persist.ClassMolder.store(Unknown Source)
[CastorCheckup]         at
org.exolab.castor.persist.LockEngine.store(Unknown Source)
[CastorCheckup]         at
org.exolab.castor.persist.TransactionContext.prepare(Unknown Source)
[CastorCheckup]         at
org.exolab.castor.jdo.engine.DatabaseImpl.commit(Unknown Source)
[CastorCheckup]         at CastorCheckup.run(CastorCheckup.java:103)
[CastorCheckup]         at CastorCheckup.main(CastorCheckup.java:30)

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

Reply via email to