Hello !
I would like to propose fix for this bug. This is a svn diff from my working
copy:
Index:
cayenne-java/src/cayenne/java/org/objectstyle/cayenne/ObjectContextStateLog.java
===================================================================
---
cayenne-java/src/cayenne/java/org/objectstyle/cayenne/ObjectContextStateLog.java
(revision 406077)
+++
cayenne-java/src/cayenne/java/org/objectstyle/cayenne/ObjectContextStateLog.java
(working copy)
..-180,8 +180,19 @@
dirtyIds.add(nodeId);
}
+
+ /**
+ * When deleting a persistent object add it to dirtyIds,
+ * when deleting a new object there is no need to keep reference to it
anymore
+ * (ObjectContextDeleteAction sets NEW object state to TRANSIENT state
before processing delete rules)
+ */
public void nodeRemoved(Object nodeId) {
- dirtyIds.add(nodeId);
+ if
(((Persistent)graphManager.getNode(nodeId)).getPersistenceState() ==
PersistenceState.NEW ||
+
((Persistent)graphManager.getNode(nodeId)).getPersistenceState() ==
PersistenceState.TRANSIENT) {
+ dirtyIds.remove(nodeId);
+ } else {
+ dirtyIds.add(nodeId);
+ }
}
public void nodePropertyChanged(
Index:
cayenne-java/src/cayenne/java/org/objectstyle/cayenne/ObjectContextDeleteAction.java
===================================================================
---
cayenne-java/src/cayenne/java/org/objectstyle/cayenne/ObjectContextDeleteAction.java
(revision 406077)
+++
cayenne-java/src/cayenne/java/org/objectstyle/cayenne/ObjectContextDeleteAction.java
(working copy)
..-119,6 +119,7 @@
private void deleteNew(Persistent object) {
object.setPersistenceState(PersistenceState.TRANSIENT);
processDeleteRules(object, PersistenceState.NEW);
+ context.getGraphManager().nodeRemoved(object.getObjectId());
context.getGraphManager().unregisterNode(object.getObjectId());
}
I have tested it on my test project. I tried to use junit tests, but I had
some problems runnig them.
Cheers
Marcin.
On 5/14/06, Marcin Skladaniec (JIRA) <jir..pache.org> wrote:
>
> Deleting new objects leaves null object in context.
> ---------------------------------------------------
>
> Key: CAY-547
> URL: http://issues.apache.org/cayenne/browse/CAY-547
> Project: Cayenne
> Type: Bug
>
> Components: Cayenne Core Library
> Versions: 1.2 [BETA]
> Environment: Cayenne 3t.
> Reporter: Marcin Skladaniec
> Priority: Minor
>
>
> to reproduce this bug:
>
> Persistent someObject = (Persistent) context.newObject(someClass);
> context.deleteObject(someObject);
> Collection collection = context.uncommittedObjects();
>
> collection will contain a null object.
>
> The reason of that is that there are two references to (persistent)
> objects in context kept at all times. One is in GraphMap, and second is in
> GraphMap subclass CayenneContextGraphManager in stateLog field.
> I have not found that GraphMap is used to keep reference to all
> PersistentObjects in context as a whole objects.
> CayenneContextGraphManager is used rather for keeping atomic changes, and
> later for sending only those to the server. From what I found it looks like
> there is no mechanism for removing those atomic changes from stateLog. It is
> very simple, when object is created/modified/deleted it has to affect the
> database, so after any operation objectId is added to dirtyNodes. But there
> is one case when this behaviour is not right, that is when reverting some
> changes, like deleting a new object.
>
>
>
> --
> This message is automatically generated by JIRA.
> -
> If you think it was sent incorrectly contact one of the administrators:
> http://issues.apache.org/cayenne/secure/Administrators.jspa
> -
> For more information on JIRA, see:
> http://www.atlassian.com/software/jira
>
>
This archive was generated by hypermail 2.0.0 : Sun May 14 2006 - 04:39:16 EDT