You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2004/02/25 02:22:55 UTC
cvs commit: db-ojb/src/java/org/apache/ojb/odmg ObjectEnvelope.java ObjectEnvelopeTable.java TransactionImpl.java
arminw 2004/02/24 17:22:55
Modified: src/java/org/apache/ojb/odmg/states StateNewDirty.java
StateOldDirty.java StateNewClean.java
ModificationState.java
src/test/org/apache/ojb/odmg LockingTest.java
src/java/org/apache/ojb/odmg ObjectEnvelope.java
ObjectEnvelopeTable.java TransactionImpl.java
Log:
- disable "restore transient object on rollback" feature, because
OJB can't really restore a transient object, e.g. how to restore none
persistent fields or collection references
- code beautification
- new test, check multiple "lock" calls
Revision Changes Path
1.4 +2 -2 db-ojb/src/java/org/apache/ojb/odmg/states/StateNewDirty.java
Index: StateNewDirty.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/odmg/states/StateNewDirty.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- StateNewDirty.java 24 Jan 2003 22:44:10 -0000 1.3
+++ StateNewDirty.java 25 Feb 2004 01:22:55 -0000 1.4
@@ -136,7 +136,7 @@
throws org.apache.ojb.broker.PersistenceBrokerException
{
broker.store(mod.getObject(), ObjectModificationDefaultImpl.INSERT);
- mod.manage(mod.getObject());
+ mod.refreshObjectImage();
mod.setModificationState(StateOldClean.getInstance());
}
@@ -146,7 +146,7 @@
public void commit(ObjectEnvelope mod, PersistenceBroker broker) throws org.apache.ojb.broker.PersistenceBrokerException
{
broker.store(mod.getObject(), ObjectModificationDefaultImpl.INSERT);
- mod.manage(mod.getObject());
+ mod.refreshObjectImage();
mod.setModificationState(StateOldClean.getInstance());
}
1.5 +7 -2 db-ojb/src/java/org/apache/ojb/odmg/states/StateOldDirty.java
Index: StateOldDirty.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/odmg/states/StateOldDirty.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- StateOldDirty.java 28 Apr 2003 17:10:41 -0000 1.4
+++ StateOldDirty.java 25 Feb 2004 01:22:55 -0000 1.5
@@ -145,8 +145,13 @@
public void rollback(ObjectEnvelope mod, PersistenceBroker broker)
{
this.removeFromCache(mod.getObject(), broker);
- // Call added to rollback the object itself so it has the previous values again when it is used further on.
- mod.rollback();
+/*
+arminw: we can't really restore object state with all dependencies and fields
+without having a deep copy of the clean object. To avoid side-effects disable this
+feature
+*/
+// // Call added to rollback the object itself so it has the previous values again when it is used further on.
+// mod.rollback();
}
/*
1.5 +2 -3 db-ojb/src/java/org/apache/ojb/odmg/states/StateNewClean.java
Index: StateNewClean.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/odmg/states/StateNewClean.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- StateNewClean.java 13 Nov 2003 14:52:40 -0000 1.4
+++ StateNewClean.java 25 Feb 2004 01:22:55 -0000 1.5
@@ -135,7 +135,7 @@
throws org.apache.ojb.broker.PersistenceBrokerException
{
broker.store(mod.getObject(), ObjectModificationDefaultImpl.INSERT);
- mod.manage(mod.getObject());
+ mod.refreshObjectImage();
mod.setModificationState(StateOldClean.getInstance());
}
@@ -146,7 +146,7 @@
public void commit(ObjectEnvelope mod, PersistenceBroker broker) throws org.apache.ojb.broker.PersistenceBrokerException
{
broker.store(mod.getObject(), ObjectModificationDefaultImpl.INSERT);
- mod.manage(mod.getObject());
+ mod.refreshObjectImage();
mod.setModificationState(StateOldClean.getInstance());
}
@@ -157,5 +157,4 @@
{
this.removeFromCache(mod.getObject(), broker);
}
-
}
1.10 +3 -13 db-ojb/src/java/org/apache/ojb/odmg/states/ModificationState.java
Index: ModificationState.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/odmg/states/ModificationState.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- ModificationState.java 7 Jan 2004 11:41:21 -0000 1.9
+++ ModificationState.java 25 Feb 2004 01:22:55 -0000 1.10
@@ -153,26 +153,16 @@
/**
* remove Object from the ObjectCache
*/
- protected void removeFromCache(Object objToBeRemoved, PersistenceBroker broker)
+ protected void removeFromCache(Object objectOrIdentity, PersistenceBroker broker)
{
try
{
- broker.removeFromCache(objToBeRemoved);
- /*
- arminw:
- TODO: check out
- objects must also be remove from
- LoadedObjectsRegistry - Fix by Jamie Burns ????
-
- arminw:
- remove LOR from code base
- */
- // LoadedObjectsRegistry.remove(objToBeRemoved);
+ broker.removeFromCache(objectOrIdentity);
}
catch (PersistenceBrokerException e)
{
LoggerFactory.getDefaultLogger().error("[" + this.getClass().getName() + "]" +
- " Can't remove object from cache. obj was " + objToBeRemoved + ", used PB " + broker, e);
+ " Can't remove object from cache. obj was " + objectOrIdentity + ", used PB " + broker, e);
}
}
}
1.12 +41 -0 db-ojb/src/test/org/apache/ojb/odmg/LockingTest.java
Index: LockingTest.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/odmg/LockingTest.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- LockingTest.java 11 Dec 2003 20:13:23 -0000 1.11
+++ LockingTest.java 25 Feb 2004 01:22:55 -0000 1.12
@@ -18,6 +18,7 @@
import org.odmg.Transaction;
import java.util.List;
+import java.util.Collection;
/**
* Test optimistic and pessimistic locking mechanisms
@@ -77,6 +78,46 @@
if (odmg2.currentTransaction() != null) odmg2.currentTransaction().abort();
db2.close();
+ }
+
+ /**
+ * Test multiple locks on the same object
+ */
+ public void testMultipleLocks() throws Exception
+ {
+ long timestamp = System.currentTimeMillis();
+ String name = "testMultipleLocks_" + timestamp;
+ String nameUpdated = "testMultipleLocks_Updated_" + timestamp;
+ TransactionExt tx = (TransactionExt) odmg1.newTransaction();
+ LockedByVersion obj = new LockedByVersion();
+ tx.begin();
+ tx.lock(obj, Transaction.WRITE);
+ obj.setValue(name);
+ tx.lock(obj, Transaction.WRITE);
+ tx.lock(obj, Transaction.UPGRADE);
+ tx.commit();
+
+ OQLQuery query = odmg1.newOQLQuery();
+ query.create("select all from " + LockedByVersion.class.getName() + " where value like $1");
+ query.bind(name);
+ Collection result = (Collection) query.execute();
+ assertNotNull(result);
+ assertEquals(1, result.size());
+
+ tx.begin();
+ tx.lock(obj, Transaction.WRITE);
+ tx.lock(obj, Transaction.WRITE);
+ obj.setValue(nameUpdated);
+ tx.lock(obj, Transaction.WRITE);
+ tx.lock(obj, Transaction.UPGRADE);
+ tx.commit();
+
+ query = odmg1.newOQLQuery();
+ query.create("select all from " + LockedByVersion.class.getName() + " where value like $1");
+ query.bind(nameUpdated);
+ result = (Collection) query.execute();
+ assertNotNull(result);
+ assertEquals(1, result.size());
}
public void testLockBasics() throws Exception
1.28 +143 -144 db-ojb/src/java/org/apache/ojb/odmg/ObjectEnvelope.java
Index: ObjectEnvelope.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/odmg/ObjectEnvelope.java,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- ObjectEnvelope.java 8 Feb 2004 13:19:47 -0000 1.27
+++ ObjectEnvelope.java 25 Feb 2004 01:22:55 -0000 1.28
@@ -59,6 +59,14 @@
* @author <a href="mailto:mattbaird@yahoo.com">Matthew Baird</a>
*
*/
+
+import java.io.Serializable;
+import java.lang.reflect.Array;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
import org.apache.ojb.broker.Identity;
import org.apache.ojb.broker.PersistenceBrokerException;
import org.apache.ojb.broker.accesslayer.IndirectionHandler;
@@ -73,23 +81,19 @@
import org.apache.ojb.odmg.states.ModificationState;
import org.odmg.ODMGRuntimeException;
-import java.io.Serializable;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
/**
* ObjectEnvelope is used during ODMG transactions as a wrapper for a persistent objects declaration
*
*/
public class ObjectEnvelope implements ObjectModification, Serializable
{
- static final long serialVersionUID = -829177767933340522L; /**
+ static final long serialVersionUID = -829177767933340522L;
+ /**
* The objects modification state, e.g. Old and Clean
*/
private ModificationState modificationState = null;
+ private Identity oid;
+ private Boolean hasChanged;
/**
* myObj holds the object we are wrapping.
@@ -112,34 +116,39 @@
public ObjectEnvelope(Object obj, TransactionImpl aTx)
{
tx = aTx;
- manage(obj);
- setInitialModificationState();
+ myObj = ProxyHelper.getRealObject(obj);
+ refreshObjectImage();
+ prepareInitialState();
}
public void close()
- {
- myObj = null;
- beforeImage = null;
- tx = null;
- }
+ {
+ myObj = null;
+ beforeImage = null;
+ tx = null;
+ }
- /**
- * Manage an object.
- */
- public void manage(Object obj)
+ public void refreshObjectImage()
{
- myObj = ProxyHelper.getRealObject(obj);
try
{
+ hasChanged = null;
+ oid = new Identity(myObj, tx.getBroker());
beforeImage = getMap();
}
- catch (Exception ex)
+ catch(Exception ex)
{
beforeImage = null;
+ oid = null;
throw new org.odmg.ClassNotPersistenceCapableException(ex.toString());
}
}
+ public Identity getIdentity()
+ {
+ return oid;
+ }
+
/**
* returns the managed object.
*/
@@ -168,7 +177,7 @@
*/
public void beforeCommit()
{
- if (myObj instanceof TransactionAware)
+ if(myObj instanceof TransactionAware)
{
TransactionAware ta = (TransactionAware) myObj;
ta.beforeCommit();
@@ -180,7 +189,7 @@
*/
public void afterCommit()
{
- if (myObj instanceof TransactionAware)
+ if(myObj instanceof TransactionAware)
{
TransactionAware ta = (TransactionAware) myObj;
ta.afterCommit();
@@ -192,7 +201,7 @@
*/
public void beforeAbort()
{
- if (myObj instanceof TransactionAware)
+ if(myObj instanceof TransactionAware)
{
TransactionAware ta = (TransactionAware) myObj;
ta.beforeAbort();
@@ -204,7 +213,7 @@
*/
public void afterAbort()
{
- if (myObj instanceof TransactionAware)
+ if(myObj instanceof TransactionAware)
{
TransactionAware ta = (TransactionAware) myObj;
ta.afterAbort();
@@ -223,7 +232,7 @@
* 1. register all fields of object that aren't collections or references
*/
FieldDescriptor[] fieldDescs = mif.getFieldDescriptions();
- for (int i = 0; i < fieldDescs.length; i++)
+ for(int i = 0; i < fieldDescs.length; i++)
{
FieldDescriptor fd = fieldDescs[i];
PersistentField f = fd.getPersistentField();
@@ -237,14 +246,14 @@
* marked "dirty", otherwise attaching or detaching a 1:1 referenced object will
* not be updated in ODMG.
*/
- Iterator iter = mif.getObjectReferenceDescriptors().iterator();
- ObjectReferenceDescriptor rds = null;
+ Iterator iter = mif.getObjectReferenceDescriptors().iterator();
+ ObjectReferenceDescriptor rds = null;
Object temp = null;
- while (iter.hasNext())
- {
- rds = (ObjectReferenceDescriptor) iter.next();
+ while(iter.hasNext())
+ {
+ rds = (ObjectReferenceDescriptor) iter.next();
- /*
+/*
* synchronize on myObj so the ODMG-layer can take a snapshot only of
* fully cached (i.e. with all references + collections) objects
*/
@@ -262,7 +271,7 @@
*/
IndirectionHandler handler = ProxyHelper.getIndirectionHandler(temp);
- if (handler != null)
+ if(handler != null)
{
/**
* only register if the proxy has been materialized
@@ -272,10 +281,10 @@
fieldValues.put(rds, handler.getIdentity());
}
else
- {
+ {
fieldValues.put(rds, temp);
}
- }
+ }
/**
* MBAIRD
* 3. now let's register the collection descriptors
@@ -284,30 +293,34 @@
*/
Iterator collections = mif.getCollectionDescriptors().iterator();
CollectionDescriptor collectionDescriptor = null;
- while (collections.hasNext())
+ while(collections.hasNext())
{
collectionDescriptor = (CollectionDescriptor) collections.next();
- Object items = collectionDescriptor.getPersistentField().get(myObj);
- if (items != null)
+ Object collectionOrArray = collectionDescriptor.getPersistentField().get(myObj);
+ if(collectionOrArray != null)
{
- // items might be a Collection or an array.
- if (items instanceof Collection)
+ int referencesId = 0;
+ // no special treatment for CollectionProxies required,
+ // their size() method does not materialize the elements.
+ /**
+ * MBAIRD
+ * size isn't the safest thing to use as the dirty bit. This will
+ * need to be fixed.
+ */
+ if(collectionOrArray instanceof Collection)
+ {
+ referencesId = ((Collection) collectionOrArray).size();
+ }
+ else if(collectionOrArray.getClass().isArray())
{
- // no special treatment for CollectionProxies required,
- // their size() method does not materialize the elements.
- /**
- * MBAIRD
- * size isn't the safest thing to use as the dirty bit. This will
- * need to be fixed.
- */
- Object dirtyMark = new Integer(((Collection)items).size());
- fieldValues.put(collectionDescriptor, dirtyMark);
+ referencesId = Array.getLength(collectionOrArray);
}
- else // items instanceof Object[]
+ else
{
- Object dirtyMark = new Integer(items.hashCode());
- fieldValues.put(collectionDescriptor, dirtyMark);
+ referencesId = collectionOrArray.hashCode();
}
+
+ fieldValues.put(collectionDescriptor, new Integer(referencesId));
}
}
return fieldValues;
@@ -350,51 +363,30 @@
* sets the initial MoificationState of the wrapped object myObj. The initial state will be StateNewDirty if myObj
* is not persisten already. The state will be set to StateOldClean if the object is already persistent.
*/
- private void setInitialModificationState()
+ private void prepareInitialState()
{
// determine appropriate modification state
ModificationState initialState = null;
- Object result;
-
-// remove LOR from code base
-// if (LoadedObjectsRegistry.isRegistered(myObj))
-// {
-// initialState = org.apache.ojb.odmg.states.StateOldClean.getInstance();
-// }
-// else
-// {
-// ...
-// }
-
- /*
- arminw:
- TODO: check out
- initial point to register used objects
- DO we really need LoadedObjectsRegistry???
- arminw:
- remove LOR from code base
- */
- // LoadedObjectsRegistry.register(myObj);
-
- Identity id = new Identity(myObj, tx.getBroker());
-
+ boolean needsInsert;
try
{
// try to lookup the object.
- result = tx.getBroker().getObjectByIdentity(id);
+ needsInsert = tx.getBroker().serviceObjectCache().lookup(oid) == null
+ && !tx.getBroker().serviceBrokerHelper().doesExist(
+ tx.getBroker().getClassDescriptor(myObj.getClass()), oid, myObj);
}
- catch (PersistenceBrokerException ex)
+ catch(PersistenceBrokerException ex)
{
LoggerFactory.getDefaultLogger().error("ObjectEnvelope: ", ex);
- throw new ODMGRuntimeException(ex.getMessage());
+ throw new ODMGRuntimeException("Unexpected error while check existence of " + myObj, ex);
}
- if (result == null)
+ if(needsInsert)
{
// if object is not already persistent it must be marked as new
// it must be marked as dirty because it must be stored even if it will not modified during tx
initialState = org.apache.ojb.odmg.states.StateNewDirty.getInstance();
}
- else if (tx.isDeleted(id))
+ else if(tx.isDeleted(oid))
{
// if object is already persistent it will be marked as old.
// it is marked as dirty as it has been deleted during tx and now it is inserted again,
@@ -417,7 +409,7 @@
*/
public void setModificationState(ModificationState newModificationState)
{
- if (newModificationState != modificationState)
+ if(newModificationState != modificationState)
{
if(LoggerFactory.getDefaultLogger().isDebugEnabled())
{
@@ -435,13 +427,13 @@
public String toString()
{
String obj = null;
- if (myObj == null)
+ if(myObj == null)
{
obj = "null";
}
else
{
- obj = new Identity(myObj,tx.getBroker()).toString();
+ obj = new Identity(myObj, tx.getBroker()).toString();
}
return obj + "(" + modificationState + ")";
}
@@ -452,67 +444,74 @@
*/
public boolean hasChanged()
{
- Map currentImage = null;
- try
+ if(hasChanged == null)
{
- currentImage = getMap();
- }
- catch (Exception e)
- {
- LoggerFactory.getDefaultLogger().warn("Could not verify object changes, return hasChanged 'true'",e);
- }
+ Map currentImage = null;
+ try
+ {
+ currentImage = getMap();
+ }
+ catch(Exception e)
+ {
+ LoggerFactory.getDefaultLogger().warn("Could not verify object changes, return hasChanged 'true'", e);
+ }
- if (beforeImage.equals(currentImage))
- return false;
- else
- return true;
+ hasChanged = (beforeImage != null && beforeImage.equals(currentImage) ? Boolean.FALSE : Boolean.TRUE);
+ }
+ return hasChanged.booleanValue();
}
- public void rollback()
- {
- if(myObj != null && beforeImage != null)
- {
- ClassDescriptor mif = tx.getBroker().getClassDescriptor(getObject().getClass());
- /**
- * Set all the field values back.
- */
- FieldDescriptor[] fieldDescs = mif.getFieldDescriptions();
- for (int i = 0; i < fieldDescs.length; i++)
- {
- FieldDescriptor fd = fieldDescs[i];
- PersistentField f = fd.getPersistentField();
-
- Object value = beforeImage.get(fd.getColumnName());
-
- f.set(myObj, value);
- }
-
- /**
- * Set all the Object Reference values back
- * Don't know exactly what to do when the are identiy objects
- * (VirtualProxy or proxy classes)
- */
- Iterator iter = mif.getObjectReferenceDescriptors().iterator();
- while (iter.hasNext())
- {
- ObjectReferenceDescriptor rds = (ObjectReferenceDescriptor) iter.next();
- Object temp = beforeImage.get(rds);
-
- if(temp instanceof Identity)
- {
- // TODO what to do now? It was a VirtualProxy instance or a Proxy class.
- }
- else
- {
- rds.getPersistentField().set(myObj, temp);
- }
- }
-
- /**
- * Now set all collections back. But we only stored DirtyMarks.
- * So what can be rolledback.?
- */
- // Iterator collections = mif.getCollectionDescriptors().iterator();
- }
- }
+/*
+arminw: we can't really restore object state with all dependencies and fields
+without having a deep copy of the clean object. To avoid side-effects disable this
+feature
+*/
+
+// public void rollback()
+// {
+// if(myObj != null && beforeImage != null)
+// {
+// ClassDescriptor mif = tx.getBroker().getClassDescriptor(getObject().getClass());
+// /**
+// * Set all the field values back.
+// */
+// FieldDescriptor[] fieldDescs = mif.getFieldDescriptions();
+// for (int i = 0; i < fieldDescs.length; i++)
+// {
+// FieldDescriptor fd = fieldDescs[i];
+// PersistentField f = fd.getPersistentField();
+//
+// Object value = beforeImage.get(fd.getColumnName());
+//
+// f.set(myObj, value);
+// }
+//
+// /**
+// * Set all the Object Reference values back
+// * Don't know exactly what to do when the are identiy objects
+// * (VirtualProxy or proxy classes)
+// */
+// Iterator iter = mif.getObjectReferenceDescriptors().iterator();
+// while (iter.hasNext())
+// {
+// ObjectReferenceDescriptor rds = (ObjectReferenceDescriptor) iter.next();
+// Object temp = beforeImage.get(rds);
+//
+// if(temp instanceof Identity)
+// {
+// // TODO what to do now? It was a VirtualProxy instance or a Proxy class.
+// }
+// else
+// {
+// rds.getPersistentField().set(myObj, temp);
+// }
+// }
+//
+// /**
+// * Now set all collections back. But we only stored DirtyMarks.
+// * So what can be rolledback.?
+// */
+// // Iterator collections = mif.getCollectionDescriptors().iterator();
+// }
+// }
}
1.28 +2 -4 db-ojb/src/java/org/apache/ojb/odmg/ObjectEnvelopeTable.java
Index: ObjectEnvelopeTable.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/odmg/ObjectEnvelopeTable.java,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- ObjectEnvelopeTable.java 13 Nov 2003 14:52:40 -0000 1.27
+++ ObjectEnvelopeTable.java 25 Feb 2004 01:22:55 -0000 1.28
@@ -244,7 +244,7 @@
}
/**
- *
+ *
*/
private void setCleanState()
{
@@ -258,7 +258,7 @@
ObjectEnvelope mod = (ObjectEnvelope) mhtObjectEnvelopes.get(iter.next());
if(mod.getModificationState() != StateOldClean.getInstance())
{
- mod.manage(mod.getObject());
+ mod.refreshObjectImage();
mod.setModificationState(StateOldClean.getInstance());
}
}
@@ -278,8 +278,6 @@
{
boolean markDirty = false;
ObjectEnvelope mod = (ObjectEnvelope) mhtObjectEnvelopes.get(iter.next());
- if (log.isDebugEnabled())
- log.debug("commit: " + mod);
// if the Object has been modified by transaction, mark object as dirty
// but only if it has not been marked during tx already !!
if ((!mod.needsDelete()) && (!mod.needsInsert()) && (!mod.needsUpdate()))
1.54 +39 -28 db-ojb/src/java/org/apache/ojb/odmg/TransactionImpl.java
Index: TransactionImpl.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/odmg/TransactionImpl.java,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -r1.53 -r1.54
--- TransactionImpl.java 10 Feb 2004 15:28:18 -0000 1.53
+++ TransactionImpl.java 25 Feb 2004 01:22:55 -0000 1.54
@@ -823,42 +823,53 @@
{
registerToIndirectionHandler(handler);
registerUnmaterializedLocks(newTxObject);
- return;
+ // all work is done, so set to null
+ objectToRegister = null;
}
}
- // no Proxy:
- if (objectToRegister == null)
- return;
- ObjectEnvelope envelope = objectEnvelopeTable.getByIdentity(new Identity(objectToRegister, getBroker()));
- if ((envelope == null) || envelope.needsDelete())
- {
- // if OJB is configured to use only implicit readlocks, change the lockmode
- int assLockMode = lockMode;
- if (!useWriteLocks)
+ // no Proxy and is not null, register real object
+ if (objectToRegister != null)
+ {
+ ClassDescriptor cld = this.getBroker().getClassDescriptor(objectToRegister.getClass());
+ ObjectEnvelope envelope = objectEnvelopeTable.getByIdentity(new Identity(objectToRegister, getBroker(), cld));
+ // if we found an envelope, object is already registered and we do nothing!
+ if ((envelope == null) || envelope.needsDelete())
{
- assLockMode = Transaction.READ;
+ // 1. register associated objects
+ doLockReferences(cld, objectToRegister, lockMode);
+ // 2. register object itself
+ objectEnvelopeTable.put(objectToRegister, new ObjectEnvelope(objectToRegister, this));
+ doLockCollections(cld, objectToRegister, lockMode);
}
+ }
+ }
- ClassDescriptor cld = null;
- cld = this.getBroker().getClassDescriptor(objectToRegister.getClass());
- // 1. register associated objects
- if (useImplicitLocking)
- {
- lockReferences(cld, objectToRegister, assLockMode);
- }
- // 2. register object itself
- objectEnvelopeTable.put(objectToRegister, new ObjectEnvelope(objectToRegister, this));
+ protected void doLockReferences(ClassDescriptor cld, Object objectToRegister,
+ int assLockMode) throws LockNotGrantedException
+ {
+ // if OJB is configured to use only implicit readlocks, change the lockmode
+ if (!useWriteLocks)
+ {
+ assLockMode = Transaction.READ;
+ }
+ if (useImplicitLocking)
+ {
+ lockReferences(cld, objectToRegister, assLockMode);
+ }
+ }
- // 3. register objects in collection attributes
- if (useImplicitLocking)
- {
- lockCollections(cld, objectToRegister, assLockMode);
- }
+ protected void doLockCollections(ClassDescriptor cld, Object objectToRegister,
+ int assLockMode) throws LockNotGrantedException
+ {
+ // if OJB is configured to use only implicit readlocks, change the lockmode
+ if (!useWriteLocks)
+ {
+ assLockMode = Transaction.READ;
}
- else
+ if (useImplicitLocking)
{
- // Object already registered, do nothing!
+ lockCollections(cld, objectToRegister, assLockMode);
}
}
@@ -870,7 +881,7 @@
{
Object refInstance = ProxyHelper.getRealObject(ref);
ClassDescriptor objCld = this.getBroker().getClassDescriptor(obj.getClass());
- org.apache.ojb.broker.metadata.FieldDescriptor[] objFkFields = rds.getForeignKeyFieldDescriptors(objCld);
+ FieldDescriptor[] objFkFields = rds.getForeignKeyFieldDescriptors(objCld);
// oma: refInstance might be null in case of dangling foreign keys.
ValueContainer[] refPkValues;
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org