// object graph
if (processFlattened) {
ObjectStore objectStore = dataContext.getObjectStore();
Iterator iterator = relatedObjects.iterator();
while (iterator.hasNext()) {
Persistent relatedObject = (Persistent) iterator.next();
objectStore.arcDeleted(object.getObjectId(), relatedObject
.getObjectId(), relationship.getName());
}
}
// process remaining rules
switch (relationship.getDeleteRule()) {
case DeleteRule.NO_ACTION:
break;
case DeleteRule.NULLIFY:
ArcProperty reverseArc = property.getComplimentaryReverseArc();
if (reverseArc == null) {
// nothing we can do here
break;
}
final Collection finalRelatedObjects = relatedObjects;
reverseArc.visit(new PropertyVisitor() {
public boolean visitAttribute(AttributeProperty property) {
return false;
}
public boolean visitToMany(ToManyProperty property) {
Iterator iterator = finalRelatedObjects.iterator();
while (iterator.hasNext()) {
Object relatedObject = iterator.next();
property.removeTarget(relatedObject, object, true);
}
return false;
}
public boolean visitToOne(ToOneProperty property) {
// Inverse is to-one - find all related objects and
// nullify the reverse relationship
Iterator iterator = finalRelatedObjects.iterator();
while (iterator.hasNext()) {
Object relatedObject = iterator.next();
property.setTarget(relatedObject, null, true);
}
return false;
}
});
break;
case DeleteRule.CASCADE:
// Delete all related objects
Iterator iterator = relatedObjects.iterator();
while (iterator.hasNext()) {
Persistent relatedObject = (Persistent) iterator.next();
new DataContextDeleteAction(this.dataContext)
.performDelete(relatedObject);
}
break;