My previous email on this topic was a bit verbose, and I later
realized contained some inaccuracies. Keeping things as succinct as
possible, is there any reason the spec couldn't be amended to support
the following code?
package com.xyz;
import org.apache.log4j.Logger;
import javax.jdo.*;
import static javax.jdo.JDOHelper.*;
public class Main {
public static final Logger logger = Logger.getLogger(Main.class);
public static void main(String... args) {
PersistenceManagerFactory pmf =
JDOHelper.getPersistenceManagerFactory("jpox.properties");
PersistenceManager pm = pmf.getPersistenceManager();
assert pm.getDetachAllOnCommit() == true;
A parameter = new A();
A returned;
logger.info("making newly created parameter instance
persistent");
pm.currentTransaction().begin();
returned = pm.makePersistent(parameter);
pm.currentTransaction().commit();
assert parameter == returned;
assert isDetached(parameter) && !isDirty(parameter);
logger.info("dirtying parameter instance");
parameter.setName("mud");
assert isDetached(parameter) && isDirty(parameter);
logger.info("reattaching dirtied parameter instance");
pm.currentTransaction().begin();
returned = pm.makePersistent(parameter);
pm.currentTransaction().commit();
// these assertions currently fail
assert parameter == returned;
assert isDetached(parameter) && !isDirty(parameter);
}
}
@javax.jdo.annotations.PersistenceCapable(detachable = "true")
class A {
private String name;
public void setName(String name) { this.name = name; }
}
Thanks,
- Chris Beams