map.put("openjpa.RemoteCommitProvider", "sjvm");
versionTest(getEmf(map));
}
private void versionTest(EntityManagerFactory pmf) {
ValueStrategyPC pc = new ValueStrategyPC();
pc.setName("pc");
OpenJPAEntityManager pm = (OpenJPAEntityManager)
pmf.createEntityManager();
startTx(pm);
pm.persist(pc);
ClassMetaData meta = getConfiguration()
.getMetaDataRepositoryInstance().
getMetaData(pc.getClass(), null, false);
assertNotNull(meta.getVersionField());
assertEquals("version", meta.getVersionField().getName());
assertEquals(0, pc.getVersion());
endTx(pm);
assertEquals(1, pc.getVersion());
Object oid = pm.getObjectId(pc);
endEm(pm);
// do no-op commit
pm = (OpenJPAEntityManager) pmf.createEntityManager();
pc = (ValueStrategyPC) pm.find(ValueStrategyPC.class, oid);
assertNotNull(pc);
assertEquals(1, pc.getVersion());
startTx(pm);
try {
pc.setVersion(10);
fail("Allowed change to version field.");
} catch (RuntimeException re) {
}
endTx(pm);
assertEquals(1, pc.getVersion());
endEm(pm);
// do real commit
pm = (OpenJPAEntityManager) pmf.createEntityManager();
pc = (ValueStrategyPC) pm.find(ValueStrategyPC.class, oid);
assertNotNull(pc);
assertEquals(1, pc.getVersion());
startTx(pm);
pc.setName("changed");
pm.flush();
assertEquals(1, pc.getVersion());
endTx(pm);
assertEquals("changed", pc.getName());
assertEquals(2, pc.getVersion());
endEm(pm);
// rollback
pm = (OpenJPAEntityManager) pmf.createEntityManager();
pc = (ValueStrategyPC) pm.find(ValueStrategyPC.class, oid);
assertNotNull(pc);
assertEquals(2, pc.getVersion());
startTx(pm);
pc.setName("changed2");
pm.flush();
assertEquals(2, pc.getVersion());
rollbackTx(pm);
assertEquals(2, pc.getVersion());
endEm(pm);
}