Sylvie,

I've just run a couple of tests trying to create an object and load it again 
using both Database.load() and OQLQuery.execute() ... and I don't have an 
problems.  Here's a code fragment I used in one of the tests:

        public void testQueryAccountCreatedWithinTransaction() throws Exception 
{
                Account account = null;

                Database db = jdo.getDatabase();

                db.begin();
                account = new Account();
                account.setId (new Integer (10));
                account.setDescription("account 10");
                db.create(account);
                
                OQLQuery query = db.getOQLQuery("select account from 
testXXX.Account account where id = 10");
                QueryResults results = query.execute();
                assertTrue (results.hasMore());
                if (results.hasMore()) {
                        account = (Account) results.next();
                        assertNotNull (account);
                        assertEquals (new Integer(10), account.getId());
                        assertEquals ("account 10", account.getDescription());
                }
                db.commit();

                db.begin();
                account = (Account) db.load (Account.class, new Integer (10));
                db.remove (account);
                db.commit();

                db.close();
        }

As you can see, I am creating a new Account instance (id 10), and use a 
OQLQuery to obtain the very same object again.  

If that little code fragment does not mimick what you are doing, let me know 
where the difference is.

Regards
Werner

On Tue, 09 Nov 2004 19:01:35 +0100, SYLVIE PALLUEL wrote:

>
>I have only one transaction to do everything. So I shouldn't have pb with
>transaction isolation.
>
>After having read your answer, I've made new tests.
>
>While using a database which supports rollback, I can do this in the same
>transaction:
>. create an object A
>. read back the object A with a pass-thru OQL query 
>. read back the object A with a db.load(...,objetA.getId())
>. apply the rollback
>
>I can't :
>. read back the object A with a OQL query 
>
>And If I have two different transactions before the rollback, I can't read
>(anyway I use) in my transaction #2 the object being created in my
>transaction #1. So the transaction isolation is ok.
>
>I think there's really something wrong with the way the OQL query is
>executed in this case.
>Is there something new on this point with the future version?
>
>The same tests made using direct access by jdbc are ok.
>
>Thanks for your interest.
>
>Sylvie.  
>
>P.S.:
>I can't commit the create before trying to access the object in OQL, because
>I must rollback everything from the beginning, if there's anything wrong
>during the whole operation.
>
>I tried to explain to the developers that it should be better to store the
>id in a variable somewhere and access later when trying to load it (rather
>than through a query, OQL or otherwise)... But they just see the fact that
>it must work like simple jdbc way ... 
>
>
>___________________
>CREDI RA
>Sylvie Palluel
>
>[EMAIL PROTECTED]
>___________________
>
>-----Message d'origine-----
>De : Patrick van Kann [mailto:[EMAIL PROTECTED] 
>Envoyé : mardi 9 novembre 2004 18:06
>À : SYLVIE PALLUEL
>Objet : RE: RE : RE : [castor-dev] [jdo] Reading, in the same transaction, a
>data just created (reading via oql query)
>
>In that case, I think Castor OQL is behaving correctly with respect to
>transaction isolation.
>MySQL without Innodb simply doesn't support transactions, hence the data is
>written regardless of whether you call db.commit().
>In order to guarantee that your transaction is isolated, queries should not
>have access to the data in the database until it commits for the reason I
>stated earlier. If your application uses JDBC or pass-through to load an
>object that could become unavailable due a rollback, your app would be in an
>inconsistent state.
>
>I think you should consider re-designing your application so that you either
>commit the create before trying to access the object in OQL, or you need to
>store the id in a variable somewhere that you can access later when trying
>to load it (rather than through a query, OQL or otherwise).
>
>In any case, surely OQL is an unreliable way to retrieve an object? What if
>you had to results that matched your criteria?
>
>I hope this helps,
>
>Patrick
>
>-----Original Message-----
>From: SYLVIE PALLUEL [mailto:[EMAIL PROTECTED]
>Sent: Tue 11/9/2004 4:28 PM
>To: Patrick van Kann
>Subject: RE : RE : [castor-dev] [jdo] Reading,  in the same transaction, a
>data  just created (reading via oql query)
>
>Yes, I can confirm that when I rollback the transaction, the new data is not
>created in my database (which way I use to test).
>
>
>
>For information, I have the problem with MySql Innodb (supports rollback)
>and Oracle.
>
>With MySql Isam (no rollback), the program was ok, that means that the Oql
>query brings back the new Object ..
>
>
>
>In fact it seems that the Oql query tries to retrieve the object from the
>database, and is not looking at his cache .
>
>
>
>Sylvie.
>
>___________________
>
>CREDI RA
>
>Sylvie Palluel
>
>
>
>[EMAIL PROTECTED]
>
>___________________
>
>
>
>-----Message d'origine-----
>De : Patrick van Kann [mailto:[EMAIL PROTECTED]
>Envoyé : mardi 9 novembre 2004 16:46
>À : SYLVIE PALLUEL
>Objet : RE: RE : [castor-dev] [jdo] Reading, in the same transaction, a data
>just created (reading via oql query)
>
>
>
>I must admit I am surprised that this is the behaviour you are seeing. I
>would have thought that the data would not be written to the database until
>the commit phase, otherwise you risk dirty reads (for example if the castor
>transaction later rolls back after your JDBC call has accessed the data).
>
>Can you confirm that when you rollback the transaction (instead of
>committing) that the data in the database is removed after the rollback(i.e.
>not available to either JDBC or OQL pass through)?
>
>Patrick
>
>
>-----Original Message-----
>From: SYLVIE PALLUEL [mailto:[EMAIL PROTECTED]
>Sent: Tue 11/9/2004 3:09 PM
>To: [EMAIL PROTECTED]
>Subject: RE : [castor-dev] [jdo] Reading,  in the same transaction, a data
>just created (reading via oql query)
>
>
>I don't know if this can help you, but I made another test with an OQL
>pass-thru, and I get the new object before the commit phase.
>
>Is there something special to do to enable the OQL query to see the objects
>created inside the current transaction?
>
>Sylvie.
>
>___________________
>CREDI RA
>Sylvie Palluel
>
>[EMAIL PROTECTED]
>___________________
>
>
>> -----Message d'origine-----
>> De : SYLVIE PALLUEL [mailto:[EMAIL PROTECTED]
>> Envoyé : mardi 9 novembre 2004 15:26
>> À : [EMAIL PROTECTED]
>> Objet : Re: [castor-dev] [jdo] Reading, in the same transaction, a data
>> just created (reading via oql query)
>>
>> Hello Patrick,
>>
>> As I answered to Marco, if my example is simple, the real code is not so
>> simple!
>>
>> The program - which is running alone - tries to upgrade the content of a
>> database which contents application parameters (a new version of the
>> application will bring many new objects in different "tables", and
>> modification in some existing objects).
>>
>> The process may be long, and in fact when we need to read the object, we
>> have not anymore the object's reference: we have only keywords to retrieve
>> it from database by an oql query.
>>
>> If, in the example, I use directly jdbc, and not jdo, the query retrieves
>> the new object.
>>
>> You said OQL doesn't go through the cache: that what I thought first, but
>> if
>> I try the same thing while modifying an existing object, my oql query
>> retrieves the modified object!
>>
>>
>> db.begin();
>> log.info("Object read via oql ");
>> ArrayList lesDossiers = RequetesJdoAssure.getLesDossiers("GALO", "%", "%",
>> "%", db);
>> for (Iterator iter = lesDossiers.iterator(); iter.hasNext();) {
>>       Dossier element = (Dossier) iter.next();
>>       log.info(" Nom = " + element.getNomPatronymique() + " - Prénom = " +
>> element.getPrenom());
>>       log.info(" Modif du prénom");
>>       // The object is modified
>>       element.setPrenom("TOTO");
>> }
>>
>>
>> log.info(" Object is read again via oql ");
>> lesDossiers = RequetesJdoAssure.getLesDossiers("GALO", "%", "%", "%", db);
>> for (Iterator iter = lesDossiers.iterator(); iter.hasNext();) {
>>               Dossier elementModifie = (Dossier) iter.next();
>>               log.info(" Nom Apres modif = " +
>> elementModifie.getNomPatronymique() + " - Prénom après modif = " +
>> elementModifie.getPrenom());
>> }
>>
>>
>> So I'm little lost !
>>
>>
>> Sylvie.
>>
>> ___________________
>> CREDI RA
>> Sylvie Palluel
>>
>> [EMAIL PROTECTED]
>> ___________________
>>
>>
>> > -----Message d'origine-----
>> > De : Patrick van Kann [mailto:[EMAIL PROTECTED]
>> > Envoyé : mardi 9 novembre 2004 14:19
>> > À : [EMAIL PROTECTED]
>> > Objet : RE: [castor-dev] [jdo] Reading, in the same transaction, a data
>> > just created (reading via oql query)
>> >
>> > Sylvie,
>> >
>> > Your object won't be in the database until you call commit. Because OQL
>> > doesn't go through the cache, it won't find anything unless it is in the
>> > database.
>> >
>> > Why do you no longer have the ID? Surely you can get this from the
>> object
>> > after create()?
>> >
>> > Cheers,
>> >
>> > Patrick
>> >
>> >
>> > -----Original Message-----
>> > From: SYLVIE PALLUEL [mailto:[EMAIL PROTECTED]
>> > Sent: Tue 11/9/2004 12:43 PM
>> > To: [EMAIL PROTECTED]
>> > Subject: [castor-dev] [jdo] Reading,  in the same transaction, a data
>> > just created (reading via oql query)
>> >
>> > Sorry!
>> > Here's the complete message ...
>> >
>> > Hi,
>> >
>> > In a transaction (between the db.begin() and the db.commit()), I'm
>> > creating
>> > a new object A .
>> > And then, far away in the code, but in the same transaction, I need to
>> > read
>> > again the object A to create another object B.
>> > To do this, as I have no longer the id, I'm usinq an oql query to
>> retrieve
>> > A... But it is not found...
>> > What can I do (castor configuration or special command) to be able to
>> read
>> > it by an oql query ?
>> >
>> >
>> > db.begin();
>> >
>> > log.info(" Creating object dossier via jdo ");
>> > Dossier dossierAjoute = new Dossier();
>> > dossierAjoute.setNomPatronymique("LEGRAND");
>> > dossierAjoute.setPrenom("ALEXANDRE");
>> > dossierAjoute.setCivilite("M");
>> > dossierAjoute.setNumNatident("11111111111");
>> >
>> > db.create(dossierAjoute);
>> >
>> >
>> > log.info(" Reading back the object just created via jdo "); lesDossiers
>> =
>> > RequetesJdoAssure.getLesDossiers("LEGRAND", "%", "ALEXANDRE", "%", db);
>> > log.info(" Nbre de dossiers = " + lesDossiers.size()); // The result
>> will
>> > be
>> > 0 ... for (Iterator iter = lesDossiers.iterator(); iter.hasNext();) {
>> >     Dossier element = (Dossier) iter.next();
>> >     log.info(" Nom Apres creation = " + element.getNomPatronymique() + "
>> > - Prénom après creation = " + element.getPrenom()); }
>> >
>> > // if I had the object if I could do this ..
>> > log.info(" Reading back the object by db.load() ");
>> > Dossier dossier=(Dossier)
>> > db.load(Class.forName("fr.cnam.scapin.metier.donnees.dossiers.Dossier"),
>> > new
>> > Integer(dossierAjoute.getIdDossier()));
>> > // this will be ok
>> > log.info("Dossier relu par db.load " + dossier.toString());
>> >
>> > db.rollback();
>> >
>> >
>> >
>> > Thanks for your help.
>> >
>> > Sylvie
>> > ___________________
>> > CREDI RA
>> > Sylvie Palluel
>> >
>> > [EMAIL PROTECTED]
>> > ___________________
>> >
>> >
>> > > -----Message d'origine-----
>> > > De : SYLVIE PALLUEL [mailto:[EMAIL PROTECTED]
>> > > Envoyé : mardi 9 novembre 2004 13:23
>> > > À : [EMAIL PROTECTED]
>> > > Objet : [castor-dev] [castor-user][jdo] Reading, in the same
>> > transaction,
>> > > a data just created (reading via oql query)
>> > >
>> > > Hi,
>> > >
>> > > In a transaction (between the db.begin() and the db.commit()), I'm
>> > > creating
>> > > a new object A .
>> > > And then, far away in the code, but in the same transaction, I need to
>> > > read
>> > > again the object A to create another object B .
>> > > To do this, as I have no longer the id, I'm usinq an oql query to
>> > retrieve
>> > > A... But it is not found...
>> > > What can I do (castor configuration or special command) to be able to
>> > read
>> > > it by an oql query ?
>> > >
>> > >  .
>> >
>
>
>
>
>

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

Reply via email to