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