Hi Steve,

seems I had fixed a bug and introduce another bug - sorry.

> The insert logic is cascading anyway - the exception is thrown when
> cascadeInsertSingleReferences() encounters C, which is not new and is not
> known to the Transaction.  Here's the top of the stack trace:

If C is not new and unknown nothing should happen. Think the code section throwing the exception should be removed.
So could you try to replace ObjectEnvelopeTable line 589 to 605 with:

if(!alreadyPrepared.contains(oid))
{
    ObjectEnvelope depMod = getByIdentity(oid);
    // if the object isn't registered and is a new object, register it
    // else we have nothing to do
    if(depMod == null && rt.isNew())
    {
getTransaction().lockAndRegister(rt, Transaction.WRITE, false, getTransaction().getRegistrationList());
        depMod = getByIdentity(oid);
        cascadeInsertFor(depMod, alreadyPrepared);
    }
}

Then only unregistered new objects will be performed in cascade insert.
Does this solve your problem?

regards,
Armin


[EMAIL PROTECTED] wrote:
I am using 1.0.4 from CVS as of yesterday. I am getting this exception, thrown at ObjectEnvelopeTable line 602 (the comment is the infamous "should never occur"). The behavior was introduced in 1.32.2.22 - I have verified that it does not occur in 1.32.2.21.

What is happening is this: I am creating a new object A, which has a reference to B, which in turn has a reference to C. I have a write lock on A, a read lock on B, and no lock at all on C. ImplicitLocking is false.

The insert logic is cascading anyway - the exception is thrown when cascadeInsertSingleReferences() encounters C, which is not new and is not known to the Transaction. Here's the top of the stack trace:

java.lang.RuntimeException: Unexpected behavior
at org.apache.ojb.odmg.ObjectEnvelopeTable.cascadeInsertSingleReferences(ObjectEnvelopeTable.java:603) at org.apache.ojb.odmg.ObjectEnvelopeTable.cascadeInsertFor(ObjectEnvelopeTable.java:556) at org.apache.ojb.odmg.ObjectEnvelopeTable.cascadeInsertSingleReferences(ObjectEnvelopeTable.java:605) at org.apache.ojb.odmg.ObjectEnvelopeTable.cascadeInsertFor(ObjectEnvelopeTable.java:556) at org.apache.ojb.odmg.ObjectEnvelopeTable.cascadeInsertSingleReferences(ObjectEnvelopeTable.java:605) at org.apache.ojb.odmg.ObjectEnvelopeTable.cascadeInsertFor(ObjectEnvelopeTable.java:556) at org.apache.ojb.odmg.ObjectEnvelopeTable.cascadeMarkedForInsert(ObjectEnvelopeTable.java:536) at org.apache.ojb.odmg.ObjectEnvelopeTable.cascadingDependents(ObjectEnvelopeTable.java:505) at org.apache.ojb.odmg.ObjectEnvelopeTable.writeObjects(ObjectEnvelopeTable.java:170) at org.apache.ojb.odmg.TransactionImpl.doWriteObjects(TransactionImpl.java:384) at org.apache.ojb.odmg.TransactionImpl.prepareCommit(TransactionImpl.java:743) at org.apache.ojb.odmg.TransactionImpl.commit(TransactionImpl.java:679)

Why should cascadingDependents() even be called here? I'm unclear whether 1.32.2.22 introduced the behavior and is therefore wrong, or whether it simply exposed some other problem.

thanks,
-steve

Steve Clark
ECOS Development Group
[EMAIL PROTECTED]
(970)226-9291


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to