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
Post a Comment