Re: NullPointerException in ContextCommit with locking due to no retained snapshot on unset to-one relationship

From: Mike Kienenberger (mkienen..mail.com)
Date: Thu Mar 27 2008 - 16:30:39 EDT

  • Next message: Aristedes Maniatis: "Re: GSoC2008, a project proposal"

    Ok. I tried to do some testing on this, and as far as I can tell,
    it's only broken for 1.1, and not 1.2, 2.0, or 3.0.

    So I'm just going to patch it locally, and noting the patch in this thread:

    Index: E:/workspace311/cayenne-1.1.4/src/cayenne/java/org/objectstyle/cayenne/CayenneDataObject.java
    ===================================================================
    --- cayenne-1.1.4/src/cayenne/java/org/objectstyle/cayenne/CayenneDataObject.java (revision
    543577)
    +++ cayenne-1.1.4/src/cayenne/java/org/objectstyle/cayenne/CayenneDataObject.java (working
    copy)
    ..-289,6 +289,7 @@
             relList.remove(value);
             if (persistenceState == PersistenceState.COMMITTED) {
                 persistenceState = PersistenceState.MODIFIED;
    + dataContext.getObjectStore().retainSnapshot(this);
             }

             if (value != null && setReverse) {

    On 3/27/08, Mike Kienenberger <mkienen..mail.com> wrote:
    > Here's an interesting situation I'm debugging now for Cayenne 1.1.
    > It seems to be related to CAY-213 "NullPointerException in
    > ContextCommit with locking". I suspect that it's true of 1.2 and
    > could very well be true for 3.0 as well, although I don't have that
    > handy to test with.
    >
    > http://issues.apache.org/cayenne/browse/CAY-213
    >
    > My testing seems to reveal that the same problem occurs when you set a
    > to-one relationship to null. Line 291 in removeToManyTarget() sets
    > the state of the previous to-one relationship object to MODIFIED, but
    > doesn't retain a snapshot for that object.
    >
    > Here's some simple test code that shows the problem. And switching
    > the scalar setter with the relationship setter works around the
    > problem.
    >
    > It seems to me that the the fix is to add
    >
    > dataContext.getObjectStore().retainSnapshot(this);
    >
    > as was done for writeProperty().
    >
    >
    > public void run() throws Exception
    > {
    > initCayenne("cayenne.xml");
    >
    > // Set up database
    > createSchemaForObjEntityName(Configuration.getSharedConfiguration(),
    > "PotentialCustomer");
    > DataContext dc = DataContext.createDataContext();
    >
    > // Set up test data
    > PotentialCustomer pc =
    > (PotentialCustomer)dc.createAndRegisterNewObject(PotentialCustomer.class);
    > Premise premise = (Premise)dc.createAndRegisterNewObject(Premise.class);
    > pc.setToOneTarget("premise", premise, true);
    > dc.commitChanges();
    >
    > // Force failure:
    > pc.setToOneTarget("premise", null, true);
    > premise.writeProperty("altitude", new Integer(0));
    >
    > // On commitChanges(), no snapshot available for building locking
    > // java.lang.NullPointerException
    > // at org.objectstyle.cayenne.access.ContextCommit.appendOptimisticLockingAttributes(ContextCommit.java:564)
    >
    > dc.commitChanges();
    > }
    >
    >
    > java.lang.NullPointerException
    > at org.objectstyle.cayenne.access.ContextCommit.appendOptimisticLockingAttributes(ContextCommit.java:564)
    > at org.objectstyle.cayenne.access.ContextCommit.prepareUpdateQueries(ContextCommit.java:426)
    > at org.objectstyle.cayenne.access.ContextCommit.commit(ContextCommit.java:156)
    > at org.objectstyle.cayenne.access.DataContext.commitChanges(DataContext.java:1266)
    > at org.objectstyle.cayenne.access.DataContext.commitChanges(DataContext.java:1236)
    > at com.gvea.cayenne.TestOptimisticLockingFailureOnSingleTargetNull.run(TestOptimisticLockingFailureOnSingleTargetNull.java:110)
    > at com.gvea.cayenne.TestOptimisticLockingFailureOnSingleTargetNull.main(TestOptimisticLockingFailureOnSingleTargetNull.java:24)
    >
    > Note that some of these line numbers may vary as my version of Cayenne
    > 1.1 has local mods.
    >



    This archive was generated by hypermail 2.0.0 : Thu Mar 27 2008 - 16:31:14 EDT