Google App Engine & JDO: Transaction is not written to the datastore -


we using gae jdo2.3 , have code:

public void submit_job (httpsession session, blobkey blobkey) throws exception {   // start transaction   persistencemanager pm = pmf.get().getpersistencemanager();   transaction tx = pm.currenttransaction();   tx.begin();    // job , member datastore   key jobkey = (key)session.getattribute("jobkey");   string username = session.getattribute("username").tostring();    job job = pm.getobjectbyid(job.class, jobkey);   member m = pm.getobjectbyid(member.class, username);    // store job information in datastore   date = new date();   job.caricature = blobkey;   job.whensubmitted = now;   job.whenfinished = now;   pm.makepersistent(job);   pm.flush();   log.warning("submit_job: updating job " + job.key);    // update member information   m.numsubmittedjobs++;   pm.makepersistent(m);   pm.flush();       log.warning("submit_job: updating user " + username);    // complete transaction   tx.commit();   pm.close();   log.warning("transaction completed? " + !tx.isactive()); } 

the symptoms:

  • no exception thrown, runs fine
  • at end, transaction completed ("transaction completed? true")
  • following queries can read updated data member , job objects

but

  • the information not show in datastore manager
  • after restarting instance, jdo objects have old values. changes lost.

here our jdoconfig.xml:

<?xml version="1.0" encoding="utf-8"?> <jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"    xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"    xsi:nonamespaceschemalocation="http://java.sun.com/xml/ns/jdo/jdoconfig">     <persistence-manager-factory name="transactions-optional">        <property name="javax.jdo.persistencemanagerfactoryclass"            value="org.datanucleus.api.jdo.jdopersistencemanagerfactory"/>        <property name="javax.jdo.option.connectionurl" value="appengine"/>        <property name="javax.jdo.option.nontransactionalread" value="true"/>        <property name="javax.jdo.option.nontransactionalwrite" value="true"/>        <property name="javax.jdo.option.retainvalues" value="true"/>        <property name="datanucleus.appengine.autocreatedatastoretxns" value="true"/>        <property name="datanucleus.appengine.singletonpmfforname" value="true"/>        <property name="datanucleus.appengine.datastoreenablexgtransactions" value="true"/>    </persistence-manager-factory> </jdoconfig> 

and persistence.xml:

<?xml version="1.0" encoding="utf-8" ?> <persistence     xmlns="http://java.sun.com/xml/ns/persistence"     xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"     xsi:schemalocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"     version="1.0">      <persistence-unit name="transactions-optional">         <provider>org.datanucleus.api.jpa.persistenceproviderimpl</provider>         <properties>             <property name="datanucleus.nontransactionalread" value="true"/>             <property name="datanucleus.nontransactionalwrite" value="true"/>             <property name="datanucleus.connectionurl" value="appengine"/>         </properties>     </persistence-unit> </persistence> 

any appreciated, put lot of effort topic, unable solve yet.

thanks!

so you're setting public fields of persistable class, , somehow expect persistence mechanism know this. per jdo spec, should use setters, or annotate class doing setting persistenceaware.

and @ log too, since tells happening


Comments