Author: simoneg
Date: Wed May 25 15:42:44 2011
New Revision: 1127562
URL: http://svn.apache.org/viewvc?rev=1127562&view=rev
Log:
Better implementation of cascade and delete orphans
Modified:
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityFindMains.aj
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityLazyRelations.aj
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/Transaction.java
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/BasicDirtyTest.java
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/ReadingTest.java
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionPartWritingTest.java
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/F1Team.java
Modified:
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityFindMains.aj
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityFindMains.aj?rev=1127562&r1=1127561&r2=1127562&view=diff
==============================================================================
---
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityFindMains.aj
(original)
+++
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityFindMains.aj
Wed May 25 15:42:44 2011
@@ -3,6 +3,7 @@ package org.apache.magma.database.mongo;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
+import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -14,38 +15,30 @@ import org.apache.magma.beans.BeanData;
import org.apache.magma.beans.BeanHandler;
import org.apache.magma.beans.PropertyInfo;
+import com.mongodb.util.IdentitySet;
+
public aspect MongoEntityFindMains {
- // JPA cascades
- public Set<MongoEntity> MongoEntity.findMainEntities(CascadeType
cascade) {
- return findMainEntities(cascade, true);
+ public enum MainState {
+ CASCADED,
+ ORPHAN,
+ DELETEORPHAN
}
- public Set<MongoEntity> MongoEntity.findMainEntities(CascadeType
cascade, boolean mainonly) {
- Set<MongoEntity> ret = new HashSet<MongoEntity>();
- Set<MongoEntity> stack = new HashSet<MongoEntity>();
- if (cascade.equals(CascadeType.PERSIST)) {
- this.findMainEntities(cascade, ret, true, true,
mainonly, stack);
- } else if (cascade.equals(CascadeType.REMOVE)) {
- this.findMainEntities(cascade, ret, false, false,
mainonly, stack);
- } else if (cascade.equals(CascadeType.REFRESH)) {
- this.findMainEntities(cascade, ret, true, false,
mainonly, stack);
- }
+ public Map<MongoEntity,MainState>
MongoEntity.findMainEntities(CascadeType cascade) {
+ Map<MongoEntity,MainState> ret = new
IdentityHashMap<MongoEntity,MainState>();
+ Map<MongoEntity,String> stack = new
IdentityHashMap<MongoEntity,String>();
+ this.findMainEntities(cascade, ret, MainState.CASCADED, stack);
return ret;
}
- private void MongoEntity.findMainEntities(CascadeType cascade,
Set<MongoEntity> set, boolean loadedOnly, boolean dirtyOnly, boolean mainOnly,
Set<MongoEntity> stack) {
- if (stack.contains(this)) return;
- stack.add(this);
+ private void MongoEntity.findMainEntities(CascadeType cascade,
Map<MongoEntity,MainState> set, MainState state, Map<MongoEntity,String> dones)
{
+ if (dones.containsKey(this)) return;
+ dones.put(this,"a");
+ boolean loadedOnly = !cascade.equals(CascadeType.REMOVE);
BeanData bd = this.beanData();
- if ((mainOnly && !bd.isJpaSubEntity()) || !mainOnly) {
- if (dirtyOnly) {
- if (this.isDirty()) {
- set.add(this);
- }
- } else {
- set.add(this);
- }
+ if (!bd.isJpaSubEntity()) {
+ set.put(this,state);
}
BeanHandler bh = this.handler();
List<PropertyInfo> rels = bd.getJpaRelationFields();
@@ -60,12 +53,15 @@ public aspect MongoEntityFindMains {
continue;
}
if (this.isLoaded(pi.getName()) || !loadedOnly) {
+ Set loadeds = new
HashSet(this.getLoaded(pi.getName()));
if (pi.isCollection()) {
Class<? extends MongoEntity> oth =
pi.getCollectionClass();
Collection c = (Collection)
bh.getValue(pi.getName());
for (Object val : c) {
- if (val != null)
((MongoEntity)val).findMainEntities(cascade, set, loadedOnly, dirtyOnly,
mainOnly, stack);
+ if (val != null)
((MongoEntity)val).findMainEntities(cascade, set,state,dones);
+ loadeds.remove(val);
}
+
} else if (pi.isMap()) {
Class mk = pi.getMapKeyClass();
BeanData kbd = BeanData.getFor(mk);
@@ -77,18 +73,28 @@ public aspect MongoEntityFindMains {
Map.Entry entry =
(Entry) entryobj;
if (kbd.isJpaClass()) {
Object obj =
entry.getKey();
- if (obj !=
null) ((MongoEntity)obj).findMainEntities(cascade, set, loadedOnly, dirtyOnly,
mainOnly, stack);
+ if (obj !=
null) ((MongoEntity)obj).findMainEntities(cascade, set, state, dones);
+
loadeds.remove(obj);
}
if (vbd.isJpaClass()) {
Object obj =
entry.getValue();
- if (obj !=
null) ((MongoEntity)obj).findMainEntities(cascade, set, loadedOnly, dirtyOnly,
mainOnly, stack);
+ if (obj !=
null) ((MongoEntity)obj).findMainEntities(cascade, set, state, dones);
+
loadeds.remove(obj);
}
}
}
} else {
Class<? extends MongoEntity> oth =
pi.getType();
MongoEntity val = (MongoEntity)
bh.getValue(pi.getName());
- if (val != null)
val.findMainEntities(cascade, set, loadedOnly, dirtyOnly, mainOnly, stack);
+ if (val != null)
val.findMainEntities(cascade, set, state, dones);
+ loadeds.remove(val);
+ }
+ for (Object object : loadeds) {
+ if (pi.isJpaDeleteOrphans()) {
+
((MongoEntity)object).findMainEntities(CascadeType.REMOVE, set,
MainState.DELETEORPHAN, dones);
+ } else {
+
((MongoEntity)object).findMainEntities(cascade, set, MainState.ORPHAN, dones);
+ }
}
}
}
Modified:
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityLazyRelations.aj
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityLazyRelations.aj?rev=1127562&r1=1127561&r2=1127562&view=diff
==============================================================================
---
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityLazyRelations.aj
(original)
+++
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityLazyRelations.aj
Wed May 25 15:42:44 2011
@@ -43,6 +43,8 @@ public aspect MongoEntityLazyRelations {
if (collection instanceof ListeningCollectionWrapper) return
collection;
+ if (!pi.isWriteable()) throw new MagmaException("Cannot replace
a collection on {0}.{1} cause property is not writable", bean.getClass(),
pi.getName());
+
Class<? extends Collection> collectionClass = pi.getType();
if (collection == null) {
if (List.class.isAssignableFrom(collectionClass)) {
@@ -95,7 +97,7 @@ public aspect MongoEntityLazyRelations {
BeanHandler bh = bean.handler();
bh.setValue(pi.getName(), ret);
bh.commit();
-
+
if (dynamic) {
bean.loaded(pi.getName(), collection);
} else {
Modified:
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/Transaction.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/Transaction.java?rev=1127562&r1=1127561&r2=1127562&view=diff
==============================================================================
---
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/Transaction.java
(original)
+++
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/Transaction.java
Wed May 25 15:42:44 2011
@@ -6,6 +6,7 @@ import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.IdentityHashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -26,6 +27,7 @@ import org.apache.magma.beans.BeanHandle
import org.apache.magma.beans.PropertyInfo;
import org.apache.magma.database.Database;
import org.apache.magma.database.InstallIdByDefault.WithDefaultId;
+import org.apache.magma.database.mongo.MongoEntityFindMains.MainState;
import
org.apache.magma.database.openjpa.InstallVersionByDefault.WithDefaultVersion;
import org.bson.BSONObject;
@@ -45,6 +47,7 @@ public class Transaction {
private WriteConcern writeConcern;
private List<MongoCursor> cursors = new ArrayList<MongoCursor>();
private Set<MongoEntity> confirmedSave = new HashSet<MongoEntity>();
+ private Set<MongoEntity> confirmedDelete = new HashSet<MongoEntity>();
private boolean fastSecondPhase = true;
@@ -194,32 +197,34 @@ public class Transaction {
public void save(MongoEntity mpbean) {
mpbean.prepareForDb(this);
- Set<MongoEntity> mains =
mpbean.findMainEntities(CascadeType.PERSIST, false);
- for (MongoEntity entity : mains) {
+ confirmedSave.add(mpbean);
+ Map<MongoEntity,MainState> mains =
mpbean.findMainEntities(CascadeType.PERSIST);
+ for (MongoEntity entity : mains.keySet()) {
entity.prepareForDb(this);
entity.setOnDb(true);
addEntity(entity);
- confirmedSave.add(entity);
if (entity.isFromDb()) {
entity.fireJpaHandlers(PreUpdate.class);
} else {
entity.fireJpaHandlers(PrePersist.class);
}
}
+
}
public void delete(MongoEntity mpbean) {
mpbean.prepareForDb(this);
- Set<MongoEntity> mains =
mpbean.findMainEntities(CascadeType.REMOVE, false);
- for (MongoEntity entity : mains) {
+ mpbean.dirtied();
+ confirmedDelete.add(mpbean);
+ Map<MongoEntity,MainState> mains =
mpbean.findMainEntities(CascadeType.REMOVE);
+ for (MongoEntity entity : mains.keySet()) {
entity.prepareForDb(this);
entity.setOnDb(false);
TransactionPart entpart = addEntity(entity);
entpart.deleted();
- confirmedSave.add(entity);
entity.fireJpaHandlers(PreRemove.class);
- }
+ }
}
@@ -344,53 +349,49 @@ public class Transaction {
*/
public void commit() {
MongoDB mdb = this.db.getDb();
- // FIXME using identity sets here would be much safer
- Set<MongoEntity> reallySaving = new HashSet<MongoEntity>();
- Set<MongoEntity> orphans = new HashSet<MongoEntity>();
- for (MongoEntity ent : this.confirmedSave) {
- if (!ent.isDirty()) continue;
+ Set<MongoEntity> tosave = new HashSet<MongoEntity>();
+ Set<MongoEntity> todelete = new HashSet<MongoEntity>();
+
+ for (MongoEntity ent : this.confirmedDelete) {
TransactionPart part = ent.getPart();
if (part == null) continue;
- reallySaving.add(ent);
+ Map<MongoEntity,MainState> mains =
ent.findMainEntities(CascadeType.REMOVE);
+ todelete.addAll(mains.keySet());
}
- // TODO this should be acycle, what if a dirty loaded is inside
another dirty loaded and so on?
- // Add dirty loadeds of really saving entities and orphans to
delete
- Set<MongoEntity> discovereds = new HashSet<MongoEntity>();
- for (MongoEntity ent : reallySaving) {
- Set<Map.Entry<String, Set<MongoEntity>>> loadeds =
ent.getLoadedsEntry();
- for (Map.Entry<String, Set<MongoEntity>> loaded :
loadeds) {
- Set<MongoEntity> oldents = loaded.getValue();
- if (oldents == null || oldents.size() == 0)
continue;
- PropertyInfo loadedpi =
ent.beanData().getProperty(loaded.getKey());
- if (loadedpi.isMongoPersisted()) {
- Set<MongoEntity> tgt = discovereds;
- if (loadedpi.isJpaDeleteOrphans())
- tgt = orphans;
- for (MongoEntity oldent : oldents) {
- // FIXME only dirties should be
saved here, except for orphans
- if (oldent.isFromDb())
- tgt.add(oldent);
- }
+ for (MongoEntity ent : this.confirmedSave) {
+ TransactionPart part = ent.getPart();
+ if (part == null) continue;
+ Map<MongoEntity,MainState> mains =
ent.findMainEntities(CascadeType.PERSIST);
+ for (Map.Entry<MongoEntity, MainState> entry :
mains.entrySet()) {
+ if
(entry.getValue().equals(MainState.DELETEORPHAN)) {
+ todelete.add(entry.getKey());
+ } else {
+ todelete.remove(entry.getKey());
+ tosave.add(entry.getKey());
}
}
- }
- reallySaving.addAll(discovereds);
- orphans.removeAll(reallySaving);
-
- // TODO this should also be in a cycle, deletin an orphan could
lead to deletion of other entities
- for (MongoEntity ent : orphans) {
- this.delete(ent);
+
+ }
+
+ for (MongoEntity deleting : todelete) {
+ deleting.getPart().deleted();
+ deleting.dirtied();
+ tosave.add(deleting);
+ }
+
+ for (Iterator iterator = tosave.iterator();
iterator.hasNext();) {
+ MongoEntity saving = (MongoEntity) iterator.next();
+ if (saving.isFromDb() && !saving.isDirty())
+ iterator.remove();
}
- // TODO once this is in a big loop, adding orphans could be not
necessary, cause they end up in confirmedSave
- reallySaving.addAll(orphans);
- if (reallySaving.size() == 0) return;
+ if (tosave.size() == 0) return;
BasicDBObject entlist = new BasicDBObject();
- for (MongoEntity ent : reallySaving) {
+ for (MongoEntity ent : tosave) {
MongoCollection coll = getCollection(ent.getClass());
String id = MongoUtils.getMongoId(ent);
@@ -412,7 +413,7 @@ public class Transaction {
this.checkResult(trcoll.insert(mydbo, writeConcern), true,
null);
try {
- for (MongoEntity ent : reallySaving) {
+ for (MongoEntity ent : tosave) {
TransactionPart part = ent.getPart();
MongoCollection coll =
getCollection(ent.getClass());
String id = MongoUtils.getMongoId(ent);
@@ -502,8 +503,9 @@ public class Transaction {
}
}
- this.confirmedSave.removeAll(reallySaving);
- for (MongoEntity ent : reallySaving) {
+ this.confirmedSave.removeAll(tosave);
+ this.confirmedDelete.removeAll(todelete);
+ for (MongoEntity ent : tosave) {
ent.clearDirty();
if (ent.isFromDb()) {
ent.fireJpaHandlers(PostUpdate.class);
Modified:
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/BasicDirtyTest.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/BasicDirtyTest.java?rev=1127562&r1=1127561&r2=1127562&view=diff
==============================================================================
---
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/BasicDirtyTest.java
(original)
+++
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/BasicDirtyTest.java
Wed May 25 15:42:44 2011
@@ -5,10 +5,12 @@ import static org.hamcrest.CoreMatchers.
import static org.junit.Assert.*;
import static org.junit.matchers.JUnitMatchers.*;
+import java.util.Map;
import java.util.Set;
import javax.persistence.CascadeType;
+import org.apache.magma.database.mongo.MongoEntityFindMains.MainState;
import org.apache.magma.database.mongo.test.domain.Address;
import org.apache.magma.database.mongo.test.domain.Person;
import org.apache.magma.database.mongo.test.domain.ToDo;
@@ -93,11 +95,11 @@ public class BasicDirtyTest extends Mong
assertThat(p.isLoaded("addresses"), equalTo(true));
- Set<MongoEntity> persist =
p.findMainEntities(CascadeType.PERSIST);
+ Map<MongoEntity, MainState> persist =
p.findMainEntities(CascadeType.PERSIST);
assertThat(persist.size(), equalTo(2));
- assertThat(persist.contains(p), equalTo(true));
- assertThat(persist.contains(a), equalTo(true));
+ assertThat(persist.get(p), equalTo(MainState.CASCADED));
+ assertThat(persist.get(a), equalTo(MainState.CASCADED));
assertThat(p.isFromDb(), equalTo(false));
assertThat(p.isOnDb(), equalTo(false));
@@ -115,9 +117,9 @@ public class BasicDirtyTest extends Mong
persist = p.findMainEntities(CascadeType.PERSIST);
assertThat(persist.size(), equalTo(3));
- assertThat(persist.contains(p), equalTo(true));
- assertThat(persist.contains(a), equalTo(true));
- assertThat(persist.contains(td), equalTo(true));
+ assertThat(persist.get(p), equalTo(MainState.CASCADED));
+ assertThat(persist.get(a), equalTo(MainState.CASCADED));
+ assertThat(persist.get(td), equalTo(MainState.CASCADED));
assertThat(p.isFromDb(), equalTo(false));
assertThat(p.isOnDb(), equalTo(false));
@@ -127,4 +129,5 @@ public class BasicDirtyTest extends Mong
assertThat(td.isOnDb(), equalTo(false));
}
+
}
Modified:
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/ReadingTest.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/ReadingTest.java?rev=1127562&r1=1127561&r2=1127562&view=diff
==============================================================================
---
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/ReadingTest.java
(original)
+++
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/ReadingTest.java
Wed May 25 15:42:44 2011
@@ -217,5 +217,6 @@ public class ReadingTest extends MongoDb
// TODO test lazy map loading
+ // TODO test for list order
}
Modified:
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionPartWritingTest.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionPartWritingTest.java?rev=1127562&r1=1127561&r2=1127562&view=diff
==============================================================================
---
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionPartWritingTest.java
(original)
+++
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionPartWritingTest.java
Wed May 25 15:42:44 2011
@@ -11,6 +11,7 @@ import org.apache.magma.database.mongo.t
import org.apache.magma.database.mongo.test.domain.F1Team;
import org.apache.magma.database.mongo.test.domain.Person;
import org.apache.magma.database.mongo.test.domain.Person.PersonType;
+import org.apache.magma.database.mongo.test.domain.Settings;
import org.apache.magma.database.mongo.test.utils.MongoTestCollection.Expect;
import org.hamcrest.Matcher;
import org.junit.Test;
@@ -18,6 +19,7 @@ import org.junit.Test;
import com.mongodb.BasicDBList;
import com.mongodb.DBObject;
import com.mongodb.DummyResultFactory;
+import com.mongodb.util.JSON;
public class TransactionPartWritingTest extends MongoDbTestBase {
@@ -327,7 +329,149 @@ public class TransactionPartWritingTest
db.commit();
mdb.checkAll();
- assertThat(mdb.getCollection("test", "car").getExpect().size(),
equalTo(0));
+ assertThat(mdb.getCollection("test",
"car").getExpect().toString(), mdb.getCollection("test",
"car").getExpect().size(), equalTo(0));
+ }
+
+
+ @Test
+ public void deleteOrphansCollection() throws Exception {
+ DBObject cloneDbo =
cloneDbo((DBObject)JSON.parse("{\"_id\":\"123abcdef\",\"fans\":[\"" +
BSONPieces.simplePersonId + "\",\"" + BSONPieces.complexPersonId +"\"]}"));
+
+ mdb.getCollection("test", "f1team")
+ .expectFindOne(dbObject("{'_id':'123abcdef'}"),
cloneDbo);
+
+ F1Team f1t = db.load(F1Team.class, "123abcdef");
+ assertThat(f1t.getId(), equalTo(Long.parseLong("123abcdef",
16)));
+
+ mdb.checkAll();
+
+ mdb.getCollection("test", "person")
+ .expectFind(dbObject("{'_id':{'$in':['" +
BSONPieces.simplePersonId+ "','" + BSONPieces.complexPersonId + "']}}"),
cloneDbo(BSONPieces.simplePerson),cloneDbo(BSONPieces.complexPerson));
+
+ List<Person> fans = f1t.getFans();
+
+ mdb.checkAll();
+ assertThat(fans.size(), equalTo(2));
+
+ Person other = new Person();
+ other.setName("Other");
+ fans.add(other);
+
+ assertThat(fans.size(), equalTo(3));
+
+ Person rem = fans.remove(0);
+ Person keep = fans.get(0);
+
+ assertThat(fans.size(), equalTo(2));
+
+ db.save(f1t);
+
+ mdb.getCollection("test", "f1team")
+ .expectUpdate(dbObject("{'_id':'123abcdef'}"),
dbObject("{'$push':{'__transactions':{'fans':['" +
Long.toHexString(keep.getId()) + "','" + Long.toHexString(other.getId()) +
"']}}}"));
+
+ mdb.getCollection("test", "person")
+ .addExpectation(new Expect("update", new Matcher[] {
dbObject("{'_id':'" + Long.toHexString(rem.getId()) + "'}"),dbObject("{'$push'
: {'__transactions':{'__deleted':true}}}"),anything(), anything(), anything()
}, DummyResultFactory.ok(1), true, false))
+ .addExpectation(new Expect("insert", new Matcher[] {
dbObject("{'_id':'" + Long.toHexString(other.getId()) + "'}"), notNullValue()
}, DummyResultFactory.ok(1), true, false));
+
+ db.commit();
+
+ mdb.checkAll();
+ assertThat(mdb.getCollection("test",
"person").getExpect().toString(), mdb.getCollection("test",
"person").getExpect().size(), equalTo(0));
+
+ }
+
+ @Test
+ public void dontDeleteNotOrphans() throws Exception {
+ DBObject cloneDbo = cloneDbo(BSONPieces.simplePerson);
+ cloneDbo.put("car", BSONPieces.carId);
+
+ mdb.getCollection("test", "person")
+ .expectFindOne(dbObject("{'_id':'" +
BSONPieces.simplePersonId + "'}"), cloneDbo);
+
+ Person p = db.load(Person.class, BSONPieces.simplePersonId);
+
+ mdb.checkAll();
+ BSONPieces.assertSimplePersonLoaded(p);
+
+ mdb.getCollection("test", "car")
+ .expectFindOne(dbObject("{'_id':'" + BSONPieces.carId +
"'}"), BSONPieces.car);
+
+ Car car = p.getCar();
+
+ mdb.checkAll();
+ BSONPieces.assertCarLoaded(car);
+
+ p.setName("Test");
+
+ db.save(p);
+
+ mdb.getCollection("test", "person")
+ .expectUpdate(dbObject("{'_id':'" +
BSONPieces.simplePersonId + "'}"), anything());
+
+ db.commit();
+
+ mdb.checkAll();
+ }
+
+ @Test
+ public void dontDeleteDirtyNotOrphans() throws Exception {
+ DBObject cloneDbo = cloneDbo(BSONPieces.simplePerson);
+ cloneDbo.put("car", BSONPieces.carId);
+
+ mdb.getCollection("test", "person")
+ .expectFindOne(dbObject("{'_id':'" +
BSONPieces.simplePersonId + "'}"), cloneDbo);
+
+ Person p = db.load(Person.class, BSONPieces.simplePersonId);
+
+ mdb.checkAll();
+ BSONPieces.assertSimplePersonLoaded(p);
+
+ mdb.getCollection("test", "car")
+ .expectFindOne(dbObject("{'_id':'" + BSONPieces.carId +
"'}"), cloneDbo(BSONPieces.car));
+
+ Car car = p.getCar();
+
+ mdb.checkAll();
+ BSONPieces.assertCarLoaded(car);
+
+ p.setName("Test");
+ car.setName("Test");
+
+ db.save(p);
+
+ mdb.getCollection("test", "person")
+ .expectUpdate(dbObject("{'_id':'" +
BSONPieces.simplePersonId + "'}"), anything());
+ mdb.getCollection("test", "car")
+ .expectUpdate(dbObject("{'_id':'" + BSONPieces.carId +
"'}"), anything());
+
+ db.commit();
+
+ mdb.checkAll();
+ }
+
+ @Test
+ public void dontDeleteUnloadedNotOrphans() throws Exception {
+ DBObject cloneDbo = cloneDbo(BSONPieces.simplePerson);
+ cloneDbo.put("car", BSONPieces.carId);
+
+ mdb.getCollection("test", "person")
+ .expectFindOne(dbObject("{'_id':'" +
BSONPieces.simplePersonId + "'}"), cloneDbo);
+
+ Person p = db.load(Person.class, BSONPieces.simplePersonId);
+
+ mdb.checkAll();
+ BSONPieces.assertSimplePersonLoaded(p);
+
+ p.setName("Test");
+
+ db.save(p);
+
+ mdb.getCollection("test", "person")
+ .expectUpdate(dbObject("{'_id':'" +
BSONPieces.simplePersonId + "'}"), anything());
+
+ db.commit();
+
+ mdb.checkAll();
}
// TODO test delete orphans
Modified:
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/F1Team.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/F1Team.java?rev=1127562&r1=1127561&r2=1127562&view=diff
==============================================================================
---
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/F1Team.java
(original)
+++
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/F1Team.java
Wed May 25 15:42:44 2011
@@ -1,15 +1,21 @@
package org.apache.magma.database.mongo.test.domain;
+import java.util.ArrayList;
+import java.util.List;
+
import javax.persistence.Entity;
+import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import org.apache.magma.beans.MagmaBean;
+import org.apache.openjpa.persistence.ElementDependent;
@Entity
@MagmaBean
public class F1Team {
private Car car = new Car();
+ private List<Person> fans = new ArrayList<Person>();
public F1Team() {}
@@ -28,6 +34,15 @@ public class F1Team {
public Car hiddenGetCar() {
return car;
}
-
+
+ @OneToMany
+ @ElementDependent
+ public List<Person> getFans() {
+ return fans;
+ }
+
+ public void setFans(List<Person> fans) {
+ this.fans = fans;
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]