Andrey, after your commit I have this problem:
[INFO] Compilation failure
/home/olga/cayenne-git/framework/cayenne-tools/src/test/java/org/apache/cayenne/gen/ClientDataMapGeneratedQueryRunTest.java:[59,86]
incompatible types
found : java.util.List<org.apache.cayenne.testdo.mt.MtTable1>
required: java.util.List<org.apache.cayenne.testdo.mt.ClientMtTable1>
and reasonable error in cayenne-tools.
2009/11/18 <andre..pache.org>
> Author: andrey
> Date: Wed Nov 18 12:08:20 2009
> New Revision: 881740
>
> URL: http://svn.apache.org/viewvc?rev=881740&view=rev
> Log:
> CAY-1312 Allow lifecycle callbacks on ROP client. Only method invokes, i.e.
> no configuration for those callbacks yet
>
> Added:
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/DataChannelSyncCallbackAction.java
> - copied, changed from r881253,
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCallbacksTest.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/ClientMtLifecycles.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/MtLifecycles.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtLifecycles.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtLifecycles.java
> Removed:
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextDeleteAction.java
> Modified:
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/ClientChannel.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMultiTier.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MultiTier.java
>
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml
>
> Modified:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java?rev=881740&r1=881739&r2=881740&view=diff
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java
> (original)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java
> Wed Nov 18 12:08:20 2009
>.. -33,6 +33,7 @@
> import org.apache.cayenne.graph.GraphEvent;
> import org.apache.cayenne.graph.GraphManager;
> import org.apache.cayenne.map.EntityResolver;
> +import org.apache.cayenne.map.LifecycleEvent;
> import org.apache.cayenne.map.ObjEntity;
> import org.apache.cayenne.query.ObjectIdQuery;
> import org.apache.cayenne.query.Query;
>.. -103,8 +104,6 @@
>
> public abstract void commitChangesToParent();
>
> - public abstract void deleteObject(Object object) throws
> DeleteDenyException;
> -
> public abstract Collection<?> deletedObjects();
>
> public DataChannel getChannel() {
>.. -381,9 +380,24 @@
> }
>
> /**
> - * If ObjEntity qualifier is set, asks it to inject initial value to
> an object
> + * If ObjEntity qualifier is set, asks it to inject initial value to
> an object.
> + * Also performs all Persistent initialization operations
> */
> - protected void injectInitialValue(Object object) {
> + protected void injectInitialValue(Object obj) {
> + // must follow this exact order of property initialization per
> CAY-653, i.e. have
> + // the id and the context in place BEFORE setPersistence is called
> +
> + Persistent object = (Persistent) obj;
> +
> + object.setObjectContext(this);
> + object.setPersistenceState(PersistenceState.NEW);
> +
> + GraphManager graphManager = getGraphManager();
> + synchronized (graphManager) {
> + graphManager.registerNode(object.getObjectId(), object);
> + graphManager.nodeCreated(object.getObjectId());
> + }
> +
> ObjEntity entity;
> try {
> entity =
> getEntityResolver().lookupObjEntity(object.getClass());
>.. -398,5 +412,37 @@
> ((ValueInjector)
> entity.getDeclaredQualifier()).injectValue(object);
> }
> }
> +
> + // invoke callbacks
> + getEntityResolver().getCallbackRegistry().performCallbacks(
> + LifecycleEvent.POST_ADD,
> + object);
> + }
> +
> + /**
> + * Schedules an object for deletion on the next commit of this
> context. Object's
> + * persistence state is changed to PersistenceState.DELETED; objects
> related to this
> + * object are processed according to delete rules, i.e. relationships
> can be unset
> + * ("nullify" rule), deletion operation is cascaded (cascade rule).
> + *
> + *..aram object a persistent object that we want to delete.
> + *..hrows DeleteDenyException if a DENY delete rule is applicable for
> object
> + * deletion.
> + *..hrows NullPointerException if object is null.
> + */
> + public void deleteObject(Object object) {
> + new ObjectContextDeleteAction(this).performDelete((Persistent)
> object);
> + }
> +
> + public void deleteObjects(Collection<?> objects) throws
> DeleteDenyException {
> + if (objects.isEmpty())
> + return;
> +
> + // Don't call deleteObject() directly since it would be less
> efficient.
> + ObjectContextDeleteAction ocda = new
> ObjectContextDeleteAction(this);
> +
> + // Make a copy to iterate over to avoid
> ConcurrentModificationException.
> + for (Persistent object : (ArrayList<Persistent>) new
> ArrayList(objects))
> + ocda.performDelete(object);
> }
> }
> \ No newline at end of file
>
> Modified:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java?rev=881740&r1=881739&r2=881740&view=diff
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java
> (original)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java
> Wed Nov 18 12:08:20 2009
>.. -308,27 +308,6 @@
> }
>
> /**
> - * Deletes an object locally, scheduling it for future deletion from
> the external data
> - * store.
> - */
> - ..verride
> - public void deleteObject(Object object) {
> - new ObjectContextDeleteAction(this).performDelete((Persistent)
> object);
> - }
> -
> - public void deleteObjects(Collection<?> objects) throws
> DeleteDenyException {
> - if (objects.isEmpty())
> - return;
> -
> - // Don't call deleteObject() directly since it would be less
> efficient.
> - ObjectContextDeleteAction ocda = new
> ObjectContextDeleteAction(this);
> -
> - // Make a copy to iterate over to avoid
> ConcurrentModificationException.
> - for (Persistent object : (ArrayList<Persistent>) new
> ArrayList(objects))
> - ocda.performDelete(object);
> - }
> -
> - /**
> * Creates and registers a new Persistent object instance.
> */
> ..verride
>.. -527,16 +506,6 @@
> object.setObjectId(id);
> }
>
> - // must follow this exact order of property initialization per
> CAY-653, i.e. have
> - // the id and the context in place BEFORE setPersistence is called
> - object.setObjectContext(this);
> - object.setPersistenceState(PersistenceState.NEW);
> -
> - synchronized (graphManager) {
> - graphManager.registerNode(id, object);
> - graphManager.nodeCreated(id);
> - }
> -
> injectInitialValue(object);
> }
>
>
> Copied:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/DataChannelSyncCallbackAction.java
> (from r881253,
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java)
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/DataChannelSyncCallbackAction.java?p2=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/DataChannelSyncCallbackAction.java&p1=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java&r1=881253&r2=881740&rev=881740&view=diff
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java
> (original)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/DataChannelSyncCallbackAction.java
> Wed Nov 18 12:08:20 2009
>.. -16,14 +16,13 @@
> * specific language governing permissions and limitations
> * under the License.
> ****************************************************************/
> -package org.apache.cayenne.access;
> +package org.apache.cayenne;
>
> import java.util.ArrayList;
> import java.util.Collection;
> import java.util.HashSet;
> import java.util.Set;
>
> -import org.apache.cayenne.DataChannel;
> import org.apache.cayenne.graph.GraphChangeHandler;
> import org.apache.cayenne.graph.GraphDiff;
> import org.apache.cayenne.graph.GraphManager;
>.. -32,10 +31,11 @@
>
> /**
> *..ince 3.0
> + * note: made public in 3.1 to be used in all tiers
> */
> -abstract class DataChannelSyncCallbackAction implements GraphChangeHandler
> {
> +public abstract class DataChannelSyncCallbackAction implements
> GraphChangeHandler {
>
> - static DataChannelSyncCallbackAction getCallbackAction(
> + public static DataChannelSyncCallbackAction getCallbackAction(
> LifecycleCallbackRegistry callbackRegistry,
> GraphManager graphManager,
> GraphDiff changes,
>.. -73,9 +73,9 @@
>
> protected abstract boolean hasListeners();
>
> - abstract void applyPreCommit();
> + public abstract void applyPreCommit();
>
> - abstract void applyPostCommit();
> + public abstract void applyPostCommit();
>
> void apply(LifecycleEvent callbackType, Collection<?> objects) {
> if (seenIds != null && objects != null) {
>.. -166,13 +166,13 @@
> }
>
> ..verride
> - void applyPreCommit() {
> + public void applyPreCommit() {
> apply(LifecycleEvent.PRE_PERSIST, persisted);
> apply(LifecycleEvent.PRE_UPDATE, updated);
> }
>
> ..verride
> - void applyPostCommit() {
> + public void applyPostCommit() {
> apply(LifecycleEvent.POST_UPDATE, updated);
> apply(LifecycleEvent.POST_REMOVE, removed);
> apply(LifecycleEvent.POST_PERSIST, persisted);
>.. -192,12 +192,12 @@
> }
>
> ..verride
> - void applyPreCommit() {
> + public void applyPreCommit() {
> // noop
> }
>
> ..verride
> - void applyPostCommit() {
> + public void applyPostCommit() {
> apply(LifecycleEvent.POST_LOAD, updated);
> apply(LifecycleEvent.POST_LOAD, removed);
> }
>
> Modified:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java?rev=881740&r1=881739&r2=881740&view=diff
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java
> (original)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java
> Wed Nov 18 12:08:20 2009
>.. -23,14 +23,14 @@
> import java.util.Collection;
> import java.util.Collections;
> import java.util.Iterator;
> +import java.util.Map;
>
> import org.apache.cayenne.map.DeleteRule;
> -import org.apache.cayenne.map.ObjEntity;
> +import org.apache.cayenne.map.LifecycleEvent;
> import org.apache.cayenne.map.ObjRelationship;
> import org.apache.cayenne.reflect.ArcProperty;
> import org.apache.cayenne.reflect.AttributeProperty;
> import org.apache.cayenne.reflect.ClassDescriptor;
> -import org.apache.cayenne.reflect.Property;
> import org.apache.cayenne.reflect.PropertyVisitor;
> import org.apache.cayenne.reflect.ToManyProperty;
> import org.apache.cayenne.reflect.ToOneProperty;
>.. -54,6 +54,10 @@
>
> if (oldState == PersistenceState.TRANSIENT
> || oldState == PersistenceState.DELETED) {
> + // Drop out... especially in case of DELETED we might be about
> to get
> + // into a horrible recursive loop due to CASCADE delete rules.
> + // Assume that everything must have been done correctly
> already
> + // and *don't* do it again
> return false;
> }
>
>.. -69,6 +73,11 @@
> + ", context: "
> + context);
> }
> +
> + // must resolve HOLLOW objects before delete... needed
> + // to process relationships and optimistic locking...
> +
> + context.prepareForAccess(object, null, false);
>
> if (oldState == PersistenceState.NEW) {
> deleteNew(object);
>.. -80,133 +89,148 @@
> return true;
> }
>
> - private void deleteNew(Persistent object) {
> + private void deleteNew(Persistent object) throws DeleteDenyException {
> object.setPersistenceState(PersistenceState.TRANSIENT);
> processDeleteRules(object, PersistenceState.NEW);
> +
> + // if an object was NEW, we must throw it out
> context.getGraphManager().unregisterNode(object.getObjectId());
> }
>
> - private void deletePersistent(Persistent object) {
> + private void deletePersistent(Persistent object) throws
> DeleteDenyException {
> +
> context.getEntityResolver().getCallbackRegistry().performCallbacks(
> + LifecycleEvent.PRE_REMOVE,
> + object);
> +
> int oldState = object.getPersistenceState();
> object.setPersistenceState(PersistenceState.DELETED);
> processDeleteRules(object, oldState);
> context.getGraphManager().nodeRemoved(object.getObjectId());
> }
>
> - private void processDeleteRules(final Persistent object, final int
> oldState) {
> + private Collection toCollection(Object object) {
>
> - String entityName = object.getObjectId().getEntityName();
> - final ObjEntity entity =
> context.getEntityResolver().getObjEntity(entityName);
> - ClassDescriptor descriptor =
> context.getEntityResolver().getClassDescriptor(
> - entityName);
> + if (object == null) {
> + return Collections.EMPTY_LIST;
> + }
>
> - descriptor.visitProperties(new PropertyVisitor() {
> + // create copies of collections to avoid iterator exceptions
> + if (object instanceof Collection) {
> + return new ArrayList((Collection) object);
> + }
> + else if (object instanceof Map) {
> + return new ArrayList(((Map) object).values());
> + }
> + else {
> + return Collections.singleton(object);
> + }
> + }
>
> - public boolean visitToMany(ToManyProperty property) {
> - ObjRelationship relationship = (ObjRelationship) entity
> - .getRelationship(property.getName());
> + private void processDeleteRules(final Persistent object, int oldState)
> + throws DeleteDenyException {
>
> - processRules(object, property,
> relationship.getDeleteRule(), oldState);
> - return true;
> - }
> + ClassDescriptor descriptor =
> context.getEntityResolver().getClassDescriptor(
> + object.getObjectId().getEntityName());
>
> - public boolean visitToOne(ToOneProperty property) {
> - ObjRelationship relationship = (ObjRelationship) entity
> - .getRelationship(property.getName());
> + for (final ObjRelationship relationship :
> descriptor.getEntity().getRelationships()) {
>
> - processRules(object, property,
> relationship.getDeleteRule(), oldState);
> - return true;
> - }
> + boolean processFlattened = relationship.isFlattened()
> + && relationship.isToDependentEntity()
> + && !relationship.isReadOnly();
>
> - public boolean visitAttribute(AttributeProperty property) {
> - return true;
> + // first check for no action... bail out if no flattened
> processing is needed
> + if (relationship.getDeleteRule() == DeleteRule.NO_ACTION &&
> !processFlattened) {
> + continue;
> }
> - });
> - }
> -
> - private void processRules(
> - Persistent object,
> - ArcProperty property,
> - int deleteRule,
> - int oldState) {
> -
> - if (deleteRule == DeleteRule.NO_ACTION) {
> - return;
> - }
> -
> - Collection<?> relatedObjects = relatedObjects(object, property);
> - if (relatedObjects.isEmpty()) {
> - return;
> - }
>
> - switch (deleteRule) {
> + ArcProperty property = (ArcProperty)
> descriptor.getProperty(relationship
> + .getName());
> + Collection relatedObjects =
> toCollection(property.readProperty(object));
> +
> + // no related object, bail out
> + if (relatedObjects.size() == 0) {
> + continue;
> + }
>
> - case DeleteRule.DENY:
> + // process DENY rule first...
> + if (relationship.getDeleteRule() == DeleteRule.DENY) {
> object.setPersistenceState(oldState);
> +
> String message = relatedObjects.size() == 1
> ? "1 related object"
> : relatedObjects.size() + " related objects";
> - throw new DeleteDenyException(object, property.getName(),
> message);
> -
> - case DeleteRule.NULLIFY:
> - ArcProperty reverseArc =
> property.getComplimentaryReverseArc();
> + throw new DeleteDenyException(object,
> relationship.getName(), message);
> + }
>
> - if (reverseArc != null) {
> + // process flattened with dependent join tables...
> + // joins must be removed even if they are non-existent or
> ignored in the
> + // object graph
> + if (processFlattened) {
> + Iterator iterator = relatedObjects.iterator();
> + while (iterator.hasNext()) {
> + Persistent relatedObject = (Persistent)
> iterator.next();
> +
> context.getGraphManager().arcDeleted(object.getObjectId(), relatedObject
> + .getObjectId(), relationship.getName());
> + }
> + }
>
> - if (reverseArc instanceof ToManyProperty) {
> - for (Object relatedObject : relatedObjects) {
> - ((ToManyProperty) reverseArc).removeTarget(
> - relatedObject,
> - object,
> - true);
> - }
> + // 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;
> }
> - else {
> - for (Object relatedObject : relatedObjects) {
> - ((ToOneProperty) reverseArc).setTarget(
> - relatedObject,
> - null,
> - true);
> - }
> - }
> - }
>
> - break;
> - case DeleteRule.CASCADE:
> + final Collection finalRelatedObjects = relatedObjects;
>
> - Iterator<?> iterator = relatedObjects.iterator();
> - while (iterator.hasNext()) {
> - Persistent relatedObject = (Persistent)
> iterator.next();
> + reverseArc.visit(new PropertyVisitor() {
>
> - // this action object is stateless, so we can use
> 'performDelete'
> - // recursively.
> - performDelete(relatedObject);
> - }
> + public boolean visitAttribute(AttributeProperty
> property) {
> + return false;
> + }
>
> - break;
> - default:
> - object.setPersistenceState(oldState);
> - throw new CayenneRuntimeException("Invalid delete rule: "
> + deleteRule);
> - }
> - }
> + public boolean visitToMany(ToManyProperty
> property) {
> + Iterator iterator =
> finalRelatedObjects.iterator();
> + while (iterator.hasNext()) {
> + Object relatedObject = iterator.next();
> + property.removeTarget(relatedObject,
> object, true);
> + }
>
> - private Collection<?> relatedObjects(Object object, Property property)
> {
> - Object related = property.readProperty(object);
> + return false;
> + }
>
> - if (related == null) {
> - return Collections.EMPTY_LIST;
> - }
> - // return collections by copy, to allow removal of objects from
> the underlying
> - // relationship inside the iterator
> - else if (property instanceof ToManyProperty) {
> - Collection<?> relatedCollection = (Collection<?>) related;
> - return relatedCollection.isEmpty()
> - ? Collections.EMPTY_LIST
> - : new ArrayList<Object>(relatedCollection);
> - }
> - // TODO: andrus 11/21/2007 - ToManyMapProperty check
> - else {
> - return Collections.singleton(related);
> + 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();
> + performDelete(relatedObject);
> + }
> +
> + break;
> + default:
> + object.setPersistenceState(oldState);
> + throw new CayenneRuntimeException("Invalid delete rule
> "
> + + relationship.getDeleteRule());
> + }
> }
> }
> }
>
> Modified:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java?rev=881740&r1=881739&r2=881740&view=diff
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
> (original)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
> Wed Nov 18 12:08:20 2009
>.. -35,7 +35,6 @@
> import org.apache.cayenne.DataChannel;
> import org.apache.cayenne.DataObject;
> import org.apache.cayenne.DataRow;
> -import org.apache.cayenne.DeleteDenyException;
> import org.apache.cayenne.Fault;
> import org.apache.cayenne.ObjectContext;
> import org.apache.cayenne.ObjectId;
>.. -54,7 +53,6 @@
> import org.apache.cayenne.map.DbJoin;
> import org.apache.cayenne.map.DbRelationship;
> import org.apache.cayenne.map.EntityResolver;
> -import org.apache.cayenne.map.LifecycleEvent;
> import org.apache.cayenne.map.ObjAttribute;
> import org.apache.cayenne.map.ObjEntity;
> import org.apache.cayenne.map.ObjRelationship;
>.. -629,18 +627,9 @@
> // note that the order of initialization of persistence artifacts
> below is
> // important - do not change it lightly
> object.setObjectId(id);
> - object.setObjectContext(this);
> - object.setPersistenceState(PersistenceState.NEW);
> - getObjectStore().registerNode(id, object);
> - getObjectStore().nodeCreated(id);
>
> injectInitialValue(object);
>
> - // invoke callbacks
> - getEntityResolver().getCallbackRegistry().performCallbacks(
> - LifecycleEvent.POST_ADD,
> - object);
> -
> return object;
> }
>
>.. -684,21 +673,17 @@
> else {
> persistent.setObjectId(new ObjectId(entity.getName()));
> }
> -
> - persistent.setObjectContext(this);
> - persistent.setPersistenceState(PersistenceState.NEW);
> -
> - getObjectStore().registerNode(persistent.getObjectId(), object);
> - getObjectStore().nodeCreated(persistent.getObjectId());
> -
> - // now we need to find all arc changes, inject missing value
> holders and pull in
> - // all transient connected objects
> -
> +
> ClassDescriptor descriptor =
> getEntityResolver().getClassDescriptor(
> entity.getName());
> if (descriptor == null) {
> throw new IllegalArgumentException("Invalid entity name: " +
> entity.getName());
> }
> +
> + injectInitialValue(object);
> +
> + // now we need to find all arc changes, inject missing value
> holders and pull in
> + // all transient connected objects
>
> descriptor.visitProperties(new PropertyVisitor() {
>
>.. -752,13 +737,6 @@
> return true;
> }
> });
> -
> - injectInitialValue(object);
> -
> - // invoke callbacks
> - getEntityResolver().getCallbackRegistry().performCallbacks(
> - LifecycleEvent.POST_ADD,
> - persistent);
> }
>
> /**
>.. -773,48 +751,6 @@
> }
>
> /**
> - * Schedules all objects in the collection for deletion on the next
> commit of this
> - * DataContext. Object's persistence state is changed to
> PersistenceState.DELETED;
> - * objects related to this object are processed according to delete
> rules, i.e.
> - * relationships can be unset ("nullify" rule), deletion operation is
> cascaded
> - * (cascade rule).
> - * <p>
> - * <i>"Nullify" delete rule side effect: </i> passing a collection
> representing
> - * to-many relationship with nullify delete rule may result in objects
> being removed
> - * from collection.
> - * </p>
> - *
> - *..ince 1.2
> - */
> - public void deleteObjects(Collection objects) {
> - if (objects.isEmpty()) {
> - return;
> - }
> -
> - // clone object list... this maybe a relationship collection with
> nullify delete
> - // rule, so modifying
> - for (Persistent object : new ArrayList<Persistent>(objects)) {
> - deleteObject(object);
> - }
> - }
> -
> - /**
> - * Schedules an object for deletion on the next commit of this
> DataContext. Object's
> - * persistence state is changed to PersistenceState.DELETED; objects
> related to this
> - * object are processed according to delete rules, i.e. relationships
> can be unset
> - * ("nullify" rule), deletion operation is cascaded (cascade rule).
> - *
> - *..aram object a persistent object that we want to delete.
> - *..hrows DeleteDenyException if a DENY delete rule is applicable for
> object
> - * deletion.
> - *..hrows NullPointerException if object is null.
> - */
> - ..verride
> - public void deleteObject(Object object) throws DeleteDenyException {
> - new DataContextDeleteAction(this).performDelete((Persistent)
> object);
> - }
> -
> - /**
> * If the parent channel is a DataContext, reverts local changes to
> make this context
> * look like the parent, if the parent channel is a DataDomain, reverts
> all changes.
> *
>
> Modified:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java?rev=881740&r1=881739&r2=881740&view=diff
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java
> (original)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java
> Wed Nov 18 12:08:20 2009
>.. -28,6 +28,7 @@
>
> import org.apache.cayenne.CayenneRuntimeException;
> import org.apache.cayenne.DataChannel;
> +import org.apache.cayenne.DataChannelSyncCallbackAction;
> import org.apache.cayenne.ObjectContext;
> import org.apache.cayenne.QueryResponse;
> import org.apache.cayenne.access.jdbc.BatchQueryBuilderFactory;
>
> Modified:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java?rev=881740&r1=881739&r2=881740&view=diff
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java
> (original)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java
> Wed Nov 18 12:08:20 2009
>.. -99,6 +99,7 @@
> */
> public void addListener(Class<?> entityClass, LifecycleListener
> listener) {
> addListener(LifecycleEvent.POST_ADD, entityClass, listener,
> "postAdd");
> + addListener(LifecycleEvent.POST_PERSIST, entityClass, listener,
> "prePersist");
> addListener(LifecycleEvent.POST_PERSIST, entityClass, listener,
> "postPersist");
> addListener(LifecycleEvent.PRE_REMOVE, entityClass, listener,
> "preRemove");
> addListener(LifecycleEvent.POST_REMOVE, entityClass, listener,
> "postRemove");
>
> Modified:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/ClientChannel.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/ClientChannel.java?rev=881740&r1=881739&r2=881740&view=diff
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/ClientChannel.java
> (original)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/ClientChannel.java
> Wed Nov 18 12:08:20 2009
>.. -24,6 +24,7 @@
>
> import org.apache.cayenne.CayenneRuntimeException;
> import org.apache.cayenne.DataChannel;
> +import org.apache.cayenne.DataChannelSyncCallbackAction;
> import org.apache.cayenne.ObjectContext;
> import org.apache.cayenne.ObjectId;
> import org.apache.cayenne.Persistent;
>.. -169,6 +170,14 @@
> ObjectContext originatingContext,
> GraphDiff changes,
> int syncType) {
> +
> + DataChannelSyncCallbackAction callbackAction =
> DataChannelSyncCallbackAction
> + .getCallbackAction(
> + getEntityResolver().getCallbackRegistry(),
> + originatingContext.getGraphManager(),
> + changes,
> + syncType);
> + callbackAction.applyPreCommit();
>
> changes = diffCompressor.compress(changes);
>
>.. -221,6 +230,7 @@
> }
> }
>
> + callbackAction.applyPostCommit();
> return replyDiff;
> }
>
>
> Added:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCallbacksTest.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCallbacksTest.java?rev=881740&view=auto
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCallbacksTest.java
> (added)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCallbacksTest.java
> Wed Nov 18 12:08:20 2009
>.. -0,0 +1,114 @@
> +/*****************************************************************
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements. See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership. The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License. You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied. See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + ****************************************************************/
> +package org.apache.cayenne.remote;
> +
> +import org.apache.cayenne.LifecycleListener;
> +import org.apache.cayenne.ObjectContext;
> +import org.apache.cayenne.testdo.mt.ClientMtLifecycles;
> +
> +public class RemoteCallbacksTest extends RemoteCayenneCase implements
> LifecycleListener {
> + private int added, loaded, prePersisted, postPersisted, preRemoved,
> postRemoved, preUpdated, postUpdated;
> +
> + ..verride
> + public void setUp() throws Exception {
> + super.setUp();
> + added = 0;
> + loaded = 0;
> + prePersisted = 0;
> + postPersisted = 0;
> + preRemoved = 0;
> + postRemoved = 0;
> + preUpdated = 0;
> + postUpdated = 0;
> + }
> +
> + public void testDefault() throws InterruptedException {
> + ObjectContext context = createROPContext();
> +
> context.getEntityResolver().getCallbackRegistry().addListener(ClientMtLifecycles.class,
> this);
> +
> + assertAll(0, 0, 0, 0, 0, 0, 0, 0);
> + ClientMtLifecycles l1 =
> context.newObject(ClientMtLifecycles.class);
> +
> + assertAll(1, 0, 0, 0, 0, 0, 0, 0);
> + l1.setName("x");
> + assertAll(1, 0, 0, 0, 0, 0, 0, 0);
> +
> + context.commitChanges();
> + Thread.sleep(5); //until commit
> + assertAll(1, 0, 1, 1, 0, 0, 0, 0);
> +
> + l1.setName("x2");
> + assertAll(1, 0, 1, 1, 0, 0, 0, 0);
> +
> + context.commitChanges();
> + Thread.sleep(5); //until commit
> + assertAll(1, 0, 1, 1, 1, 1, 0, 0);
> +
> + context.deleteObject(l1);
> + assertAll(1, 0, 1, 1, 1, 1, 1, 0);
> +
> + context.commitChanges();
> + Thread.sleep(5); //until commit
> + assertAll(1, 0, 1, 1, 1, 1, 1, 1);
> + }
> +
> + private void assertAll(int added, int loaded, int prePersisted, int
> postPersisted,
> + int preUpdated, int postUpdated, int preRemoved, int
> postRemoved) {
> + assertEquals(this.added, added);
> + assertEquals(this.loaded, loaded);
> + assertEquals(this.prePersisted, prePersisted);
> + assertEquals(this.postPersisted, postPersisted);
> + assertEquals(this.preRemoved, preRemoved);
> + assertEquals(this.postRemoved, postRemoved);
> + assertEquals(this.preUpdated, preUpdated);
> + assertEquals(this.postUpdated, postUpdated);
> + }
> +
> + public void postAdd(Object entity) {
> + added++;
> + }
> +
> + public void postLoad(Object entity) {
> + loaded++;
> + }
> +
> + public void postPersist(Object entity) {
> + postPersisted++;
> + }
> +
> + public void postRemove(Object entity) {
> + postRemoved++;
> + }
> +
> + public void postUpdate(Object entity) {
> + postUpdated++;
> + }
> +
> + public void prePersist(Object entity) {
> + prePersisted++;
> + }
> +
> + public void preRemove(Object entity) {
> + preRemoved++;
> + }
> +
> + public void preUpdate(Object entity) {
> + preUpdated++;
> + }
> +}
>
> Added:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/ClientMtLifecycles.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/ClientMtLifecycles.java?rev=881740&view=auto
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/ClientMtLifecycles.java
> (added)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/ClientMtLifecycles.java
> Wed Nov 18 12:08:20 2009
>.. -0,0 +1,10 @@
> +package org.apache.cayenne.testdo.mt;
> +
> +import org.apache.cayenne.testdo.mt.auto._ClientMtLifecycles;
> +
> +/**
> + * A persistent class mapped as "MtLifecycles" Cayenne entity.
> + */
> +public class ClientMtLifecycles extends _ClientMtLifecycles {
> +
> +}
>
> Added:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/MtLifecycles.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/MtLifecycles.java?rev=881740&view=auto
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/MtLifecycles.java
> (added)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/MtLifecycles.java
> Wed Nov 18 12:08:20 2009
>.. -0,0 +1,7 @@
> +package org.apache.cayenne.testdo.mt;
> +
> +import org.apache.cayenne.testdo.mt.auto._MtLifecycles;
> +
> +public class MtLifecycles extends _MtLifecycles {
> +
> +}
>
> Added:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtLifecycles.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtLifecycles.java?rev=881740&view=auto
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtLifecycles.java
> (added)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtLifecycles.java
> Wed Nov 18 12:08:20 2009
>.. -0,0 +1,37 @@
> +package org.apache.cayenne.testdo.mt.auto;
> +
> +import org.apache.cayenne.PersistentObject;
> +
> +/**
> + * A generated persistent class mapped as "MtLifecycles" Cayenne entity.
> It is a good idea to
> + * avoid changing this class manually, since it will be overwritten next
> time code is
> + * regenerated. If you need to make any customizations, put them in a
> subclass.
> + */
> +public abstract class _ClientMtLifecycles extends PersistentObject {
> +
> + public static final String NAME_PROPERTY = "name";
> +
> + protected String name;
> +
> + public String getName() {
> + if(objectContext != null) {
> + objectContext.prepareForAccess(this, "name", false);
> + }
> +
> + return name;
> + }
> + public void setName(String name) {
> + if(objectContext != null) {
> + objectContext.prepareForAccess(this, "name", false);
> + }
> +
> + Object oldValue = this.name;
> + this.name = name;
> +
> + // notify objectContext about simple property change
> + if(objectContext != null) {
> + objectContext.propertyChanged(this, "name", oldValue, name);
> + }
> + }
> +
> +}
>
> Modified:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMultiTier.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMultiTier.java?rev=881740&r1=881739&r2=881740&view=diff
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMultiTier.java
> (original)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMultiTier.java
> Wed Nov 18 12:08:20 2009
>.. -5,7 +5,7 @@
> import org.apache.cayenne.ObjectContext;
> import org.apache.cayenne.PersistentObject;
> import org.apache.cayenne.query.NamedQuery;
> -import org.apache.cayenne.testdo.mt.ClientMtTable1;
> +import org.apache.cayenne.testdo.mt.MtTable1;
>
> /**
> * This class was generated by Cayenne.
>.. -15,15 +15,21 @@
> */
> public class _ClientMultiTier {
>
> - public List<ClientMtTable1> performAllMtTable1(ObjectContext context )
> {
> + public static final String ALL_MT_TABLE1_QUERYNAME = "AllMtTable1";
> +
> + public static final String MT_QUERY_WITH_LOCAL_CACHE_QUERYNAME =
> "MtQueryWithLocalCache";
> +
> + public static final String
> PARAMETERIZED_MT_QUERY_WITH_LOCAL_CACHE_QUERYNAME =
> "ParameterizedMtQueryWithLocalCache";
> +
> + public List<MtTable1> performAllMtTable1(ObjectContext context ) {
> return context.performQuery(new NamedQuery("AllMtTable1"));
> }
>
> - public List<ClientMtTable1> performMtQueryWithLocalCache(ObjectContext
> context ) {
> + public List<MtTable1> performMtQueryWithLocalCache(ObjectContext
> context ) {
> return context.performQuery(new
> NamedQuery("MtQueryWithLocalCache"));
> }
>
> - public List<ClientMtTable1>
> performParameterizedMtQueryWithLocalCache(ObjectContext context , String g)
> {
> + public List<MtTable1>
> performParameterizedMtQueryWithLocalCache(ObjectContext context , String g)
> {
> String[] parameters = {
> "g",
> };
>
> Added:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtLifecycles.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtLifecycles.java?rev=881740&view=auto
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtLifecycles.java
> (added)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtLifecycles.java
> Wed Nov 18 12:08:20 2009
>.. -0,0 +1,23 @@
> +package org.apache.cayenne.testdo.mt.auto;
> +
> +import org.apache.cayenne.CayenneDataObject;
> +
> +/**
> + * Class _MtLifecycles was generated by Cayenne.
> + * It is probably a good idea to avoid changing this class manually,
> + * since it may be overwritten next time code is regenerated.
> + * If you need to make any customizations, please use subclass.
> + */
> +public abstract class _MtLifecycles extends CayenneDataObject {
> +
> + public static final String NAME_PROPERTY = "name";
> +
> +
> + public void setName(String name) {
> + writeProperty("name", name);
> + }
> + public String getName() {
> + return (String)readProperty("name");
> + }
> +
> +}
>
> Modified:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MultiTier.java
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MultiTier.java?rev=881740&r1=881739&r2=881740&view=diff
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MultiTier.java
> (original)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MultiTier.java
> Wed Nov 18 12:08:20 2009
>.. -14,6 +14,12 @@
> */
> public class _MultiTier {
>
> + public static final String ALL_MT_TABLE1_QUERYNAME = "AllMtTable1";
> +
> + public static final String MT_QUERY_WITH_LOCAL_CACHE_QUERYNAME =
> "MtQueryWithLocalCache";
> +
> + public static final String
> PARAMETERIZED_MT_QUERY_WITH_LOCAL_CACHE_QUERYNAME =
> "ParameterizedMtQueryWithLocalCache";
> +
> public List<MtTable1> performAllMtTable1(ObjectContext context ) {
> return context.performQuery(new NamedQuery("AllMtTable1"));
> }
>
> Modified:
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml
> URL:
> http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml?rev=881740&r1=881739&r2=881740&view=diff
>
> ==============================================================================
> ---
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml
> (original)
> +++
> cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml
> Wed Nov 18 12:08:20 2009
>.. -29,6 +29,10 @@
> <db-attribute name="TABLE4_ID" type="INTEGER"
> isPrimaryKey="true" isMandatory="true"/>
> <db-attribute name="TABLE5_ID" type="INTEGER"
> isPrimaryKey="true" isMandatory="true"/>
> </db-entity>
> + <db-entity name="MT_LIFECYCLES">
> + <db-attribute name="ID" type="INTEGER" isPrimaryKey="true"
> isMandatory="true"/>
> + <db-attribute name="NAME" type="VARCHAR" isMandatory="true"
> length="100"/>
> + </db-entity>
> <db-entity name="MT_MAP_TO_MANY">
> <db-attribute name="ID" type="INTEGER" isPrimaryKey="true"
> isMandatory="true"/>
> </db-entity>
>.. -91,6 +95,9 @@
> <obj-entity name="MtDeleteRule"
> className="org.apache.cayenne.testdo.mt.MtDeleteRule"
> clientClassName="org.apache.cayenne.testdo.mt.ClientMtDeleteRule"
> dbEntityName="MT_DELETE_RULE">
> <obj-attribute name="name" type="java.lang.String"
> db-attribute-path="NAME"/>
> </obj-entity>
> + <obj-entity name="MtLifecycles"
> className="org.apache.cayenne.testdo.mt.MtLifecycles"
> clientClassName="org.apache.cayenne.testdo.mt.ClientMtLifecycles"
> dbEntityName="MT_LIFECYCLES">
> + <obj-attribute name="name" type="java.lang.String"
> db-attribute-path="NAME"/>
> + </obj-entity>
> <obj-entity name="MtMapToMany"
> className="org.apache.cayenne.testdo.mt.MtMapToMany"
> clientClassName="org.apache.cayenne.testdo.mt.ClientMtMapToMany"
> dbEntityName="MT_MAP_TO_MANY">
> </obj-entity>
> <obj-entity name="MtMapToManyTarget"
> className="org.apache.cayenne.testdo.mt.MtMapToManyTarget"
> clientClassName="org.apache.cayenne.testdo.mt.ClientMtMapToManyTarget"
> dbEntityName="MT_MAP_TO_MANY_TARGET">
>
>
>
-- Olga Tkacheva
This archive was generated by hypermail 2.0.0 : Wed Nov 18 2009 - 09:29:41 EST