I recognized this problem too some time ago but didn't analyse as deep as Silvie because I had the identity available.
Could you try the query: select account from testXXX.Account account where description = "account 10"
Regards Ralf
Werner Guttmann schrieb:
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
--
Syscon Ingenieurbüro für Meß- und Datentechnik GmbH Ralf Joachim Raiffeisenstraße 11 D-72127 Kusterdingen Germany
Tel. +49 7071 3690 52 Mobil: +49 173 9630135 Fax +49 7071 3690 98
Email: [EMAIL PROTECTED] Web: www.syscon-world.de
----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-dev