arminw 2005/06/04 07:28:23
Modified: src/java/org/apache/ojb/broker/core Tag: OJB_1_0_RELEASE
DelegatingPersistenceBroker.java
PersistenceBrokerImpl.java
src/java/org/apache/ojb/broker Tag: OJB_1_0_RELEASE
PersistenceBrokerInternal.java
Log:
add new enhanced store/delete methods in PBI which allow only to perform the
specified object without take care of referenced objects. Think in OJB 1.x we
should introduce a better separation of methods supporting store/delete
operations based on the auto-xxx settings and methods only handle a single
object, this allows to use the auto-xxx settings in top-level api independent
from the PB-api.
Revision Changes Path
No revision
No revision
1.11.2.4 +11 -2
db-ojb/src/java/org/apache/ojb/broker/core/DelegatingPersistenceBroker.java
Index: DelegatingPersistenceBroker.java
===================================================================
RCS file:
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/DelegatingPersistenceBroker.java,v
retrieving revision 1.11.2.3
retrieving revision 1.11.2.4
diff -u -r1.11.2.3 -r1.11.2.4
--- DelegatingPersistenceBroker.java 7 May 2005 16:51:09 -0000 1.11.2.3
+++ DelegatingPersistenceBroker.java 4 Jun 2005 14:28:23 -0000 1.11.2.4
@@ -57,7 +57,6 @@
*/
public class DelegatingPersistenceBroker implements
PersistenceBrokerInternal, PBState
{
-
protected PersistenceBrokerInternal m_broker;
public DelegatingPersistenceBroker(PersistenceBrokerInternal broker)
@@ -137,6 +136,16 @@
m_broker.setManaged(managed);
}
+ public void store(Object obj, Identity oid, ClassDescriptor cld, boolean
insert, boolean ignoreReferences)
+ {
+ m_broker.store(obj, oid, cld, insert, ignoreReferences);
+ }
+
+ public void delete(Object obj, boolean ignoreReferences) throws
PersistenceBrokerException
+ {
+ m_broker.delete(obj, ignoreReferences);
+ }
+
public boolean isInTransaction() throws PersistenceBrokerException
{
return m_broker != null ? getBroker().isInTransaction() : false;
1.83.2.22 +94 -26
db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java
Index: PersistenceBrokerImpl.java
===================================================================
RCS file:
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java,v
retrieving revision 1.83.2.21
retrieving revision 1.83.2.22
diff -u -r1.83.2.21 -r1.83.2.22
--- PersistenceBrokerImpl.java 7 May 2005 16:43:06 -0000
1.83.2.21
+++ PersistenceBrokerImpl.java 4 Jun 2005 14:28:23 -0000
1.83.2.22
@@ -468,9 +468,19 @@
}
/**
- * @see org.apache.ojb.broker.PersistenceBroker#delete
+ * Deletes the concrete representation of the specified object in the
underlying
+ * persistence system. This method is intended for use in top-level api
or
+ * by internal calls.
+ *
+ * @param obj The object to delete.
+ * @param ignoreReferences With this flag the automatic
deletion/unlinking
+ * of references can be suppressed (independent of the used auto-delete
setting in metadata),
+ * except [EMAIL PROTECTED]
org.apache.ojb.broker.metadata.SuperReferenceDescriptor}
+ * these kind of reference (descriptor) will always be performed. If
<em>true</em>
+ * all "normal" referenced objects will be ignored, only the specified
object is handled.
+ * @throws PersistenceBrokerException
*/
- public void delete(Object obj) throws PersistenceBrokerException
+ public void delete(Object obj, boolean ignoreReferences) throws
PersistenceBrokerException
{
if(!isInTransaction())
{
@@ -498,7 +508,7 @@
}
try
{
- doDelete(obj);
+ doDelete(obj, ignoreReferences);
}
finally
{
@@ -507,10 +517,18 @@
}
/**
+ * @see org.apache.ojb.broker.PersistenceBroker#delete
+ */
+ public void delete(Object obj) throws PersistenceBrokerException
+ {
+ delete(obj, false);
+ }
+
+ /**
* do delete given object. Should be used by all intern classes to delete
* objects.
*/
- private void doDelete(Object obj) throws PersistenceBrokerException
+ private void doDelete(Object obj, boolean ignoreReferences) throws
PersistenceBrokerException
{
//logger.info("DELETING " + obj);
// only delete if object is not null
@@ -545,7 +563,7 @@
* 2. register object in markedForDelete map.
*/
markedForDelete.add(obj);
- Identity oid = new Identity(obj, this, cld);
+ Identity oid = serviceIdentity().buildIdentity(cld, obj);
// Invoke events on PersistenceBrokerAware instances and
listeners
BEFORE_DELETE_EVENT.setTarget(obj);
@@ -553,7 +571,7 @@
BEFORE_DELETE_EVENT.setTarget(null);
// 1. delete dependend collections
- if (cld.getCollectionDescriptors().size() > 0)
+ if (!ignoreReferences && cld.getCollectionDescriptors().size()
> 0)
{
deleteCollections(obj, cld.getCollectionDescriptors());
}
@@ -575,7 +593,7 @@
// 4. delete dependend upon objects last to avoid FK violations
if (cld.getObjectReferenceDescriptors().size() > 0)
{
- deleteReferences(obj, cld.getObjectReferenceDescriptors());
+ deleteReferences(obj, cld.getObjectReferenceDescriptors(),
ignoreReferences);
}
// remove obj from the object cache:
objectCache.remove(oid);
@@ -618,7 +636,7 @@
// make sure it's an Identity
if (!(oid instanceof Identity))
{
- oid = new Identity(oid, this);
+ oid = serviceIdentity().buildIdentity(oid);
}
query = referencesBroker.getPKQuery((Identity) oid);
}
@@ -661,26 +679,32 @@
/**
* Deletes references that <b>obj</b> points to.
- * All objects which we have a FK poiting to (Via ReferenceDescriptors)
will be deleted if auto-delete is true <b>AND</b>
- * the member field containing the object reference if NOT null.
+ * All objects which we have a FK poiting to (Via ReferenceDescriptors)
+ * will be deleted if auto-delete is true <b>AND</b>
+ * the member field containing the object reference is NOT null.
*
* @param obj Object which we will delete references for
* @param listRds list of ObjectRederenceDescriptors
+ * @param ignoreReferences With this flag the automatic
deletion/unlinking
+ * of references can be suppressed (independent of the used auto-delete
setting in metadata),
+ * except [EMAIL PROTECTED]
org.apache.ojb.broker.metadata.SuperReferenceDescriptor}
+ * these kind of reference (descriptor) will always be performed.
* @throws PersistenceBrokerException if some goes wrong - please see
the error message for details
*/
- private void deleteReferences(Object obj, List listRds) throws
PersistenceBrokerException
+ private void deleteReferences(Object obj, List listRds, boolean
ignoreReferences) throws PersistenceBrokerException
{
// get all members of obj that are references and delete them
Iterator i = listRds.iterator();
while (i.hasNext())
{
ObjectReferenceDescriptor rds = (ObjectReferenceDescriptor)
i.next();
- if (rds.getCascadingDelete() ==
ObjectReferenceDescriptor.CASCADE_OBJECT)
+ if ((!ignoreReferences && rds.getCascadingDelete() ==
ObjectReferenceDescriptor.CASCADE_OBJECT)
+ || rds.isSuperReferenceDescriptor())
{
Object referencedObject = rds.getPersistentField().get(obj);
if (referencedObject != null)
{
- doDelete(referencedObject);
+ doDelete(referencedObject, ignoreReferences);
}
}
}
@@ -724,7 +748,7 @@
Iterator colIterator =
BrokerHelper.getCollectionIterator(col);
while (colIterator.hasNext())
{
- doDelete(colIterator.next());
+ doDelete(colIterator.next(), false);
}
}
}
@@ -748,7 +772,7 @@
was new and needs insert
*/
boolean insert = serviceBrokerHelper().hasNullPKField(cld, obj);
- Identity oid = new Identity(obj, this, cld);
+ Identity oid = serviceIdentity().buildIdentity(cld, obj);
/*
if PK values are set, lookup cache or db to see whether object
needs insert or update
@@ -787,9 +811,20 @@
}
/**
- * Internal used method which start the real store work.
+ * Method which start the real store work (insert or update)
+ * and is intended for use by top-level api or internal calls.
+ *
+ * @param obj The object to store.
+ * @param oid The [EMAIL PROTECTED] Identity} of the object to store.
+ * @param cld The [EMAIL PROTECTED]
org.apache.ojb.broker.metadata.ClassDescriptor} of the object.
+ * @param insert If <em>true</em> an insert operation will be performed,
else update operation.
+ * @param ignoreReferences With this flag the automatic storing/linking
+ * of references can be suppressed (independent of the used auto-update
setting in metadata),
+ * except [EMAIL PROTECTED]
org.apache.ojb.broker.metadata.SuperReferenceDescriptor}
+ * these kind of reference (descriptor) will always be performed. If
<em>true</em>
+ * all "normal" referenced objects will be ignored, only the specified
object is handled.
*/
- protected void store(Object obj, Identity oid, ClassDescriptor cld,
boolean insert)
+ public void store(Object obj, Identity oid, ClassDescriptor cld,
boolean insert, boolean ignoreReferences)
{
if(obj == null || nowStoring.contains(obj))
{
@@ -845,7 +880,7 @@
try
{
nowStoring.add(obj);
- storeToDb(obj, cld, oid, insert);
+ storeToDb(obj, cld, oid, insert, ignoreReferences);
}
finally
{
@@ -878,14 +913,26 @@
}
/**
+ * Internal used method which start the real store work.
+ */
+ protected void store(Object obj, Identity oid, ClassDescriptor cld,
boolean insert)
+ {
+ store(obj, oid, cld, insert, false);
+ }
+
+ /**
* Store all object references that <b>obj</b> points to.
* All objects which we have a FK pointing to (Via ReferenceDescriptors)
will be
* stored if auto-update is true <b>AND</b> the member field containing
the object
* reference is NOT null.
+ * With flag <em>ignoreReferences</em> the storing/linking
+ * of references can be suppressed (independent of the used auto-update
setting),
+ * except [EMAIL PROTECTED]
org.apache.ojb.broker.metadata.SuperReferenceDescriptor}
+ * these kind of reference (descriptor) will always be performed.
*
* @param obj Object which we will store references for
*/
- private void storeReferences(Object obj, ClassDescriptor cld, boolean
insert)
+ private void storeReferences(Object obj, ClassDescriptor cld, boolean
insert, boolean ignoreReferences)
{
// get all members of obj that are references and store them
Collection listRds = cld.getObjectReferenceDescriptors();
@@ -898,7 +945,13 @@
while (i.hasNext())
{
ObjectReferenceDescriptor rds = (ObjectReferenceDescriptor)
i.next();
- if(rds.getCascadingStore() !=
ObjectReferenceDescriptor.CASCADE_NONE)
+ /*
+ arminw: the super-references (used for table per subclass
inheritance) must
+ be performed in any case. The "normal" 1:1 references can be
ignored when
+ flag "ignoreReferences" is set
+ */
+ if((!ignoreReferences && rds.getCascadingStore() !=
ObjectReferenceDescriptor.CASCADE_NONE)
+ || rds.isSuperReferenceDescriptor())
{
storeAndLinkOneToOne(false, obj, cld, rds, insert);
}
@@ -1721,7 +1774,7 @@
}
/**
- * makes object obj persistent in the underlying persistence system.
+ * Makes object obj persistent in the underlying persistence system.
* E.G. by INSERT INTO ... or UPDATE ... in an RDBMS.
* The ObjectModification parameter can be used to determine whether
INSERT or update is to be used.
* This functionality is typically called from transaction managers, that
@@ -1768,11 +1821,12 @@
* @param cld
* @param oid BRJ: what is it good for ???
* @param insert
+ * @param ignoreReferences
*/
- private void storeToDb(Object obj, ClassDescriptor cld, Identity oid,
boolean insert)
+ private void storeToDb(Object obj, ClassDescriptor cld, Identity oid,
boolean insert, boolean ignoreReferences)
{
// 1. link and store 1:1 references
- storeReferences(obj, cld, insert);
+ storeReferences(obj, cld, insert, ignoreReferences);
Object[] pkValues = oid.getPrimaryKeyValues();
if (!serviceBrokerHelper().assertValidPksForStore(cld.getPkFields(),
pkValues))
@@ -1833,7 +1887,21 @@
// Add the object to the cache.
objectCache.doInternalCache(newOid, obj,
ObjectCacheInternal.TYPE_WRITE);
// 3. store 1:n and m:n associations
- storeCollections(obj, cld, insert);
+ if(!ignoreReferences) storeCollections(obj, cld, insert);
+ }
+
+ /**
+ * I pulled this out of internal store so that when doing multiple table
+ * inheritance, i can recurse this function.
+ *
+ * @param obj
+ * @param cld
+ * @param oid BRJ: what is it good for ???
+ * @param insert
+ */
+ private void storeToDb(Object obj, ClassDescriptor cld, Identity oid,
boolean insert)
+ {
+ storeToDb(obj, cld, oid, insert, false);
}
/**
@@ -1863,7 +1931,7 @@
}
else
{
- identity = new Identity(objectOrIdentity, this);
+ identity = serviceIdentity().buildIdentity(objectOrIdentity);
}
objectCache.remove(identity);
}
No revision
No revision
1.1.2.2 +34 -1
db-ojb/src/java/org/apache/ojb/broker/PersistenceBrokerInternal.java
Index: PersistenceBrokerInternal.java
===================================================================
RCS file:
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/PersistenceBrokerInternal.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- PersistenceBrokerInternal.java 7 May 2005 16:51:09 -0000 1.1.2.1
+++ PersistenceBrokerInternal.java 4 Jun 2005 14:28:23 -0000 1.1.2.2
@@ -1,5 +1,7 @@
package org.apache.ojb.broker;
+import org.apache.ojb.broker.metadata.ClassDescriptor;
+
/* Copyright 2002-2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -35,4 +37,35 @@
* to <em>false</em> automatic.
*/
public void setManaged(boolean managed);
+
+ /**
+ * Method which start the real store work (insert or update)
+ * and is intended for use by top-level api or internal calls.
+ *
+ * @param obj The object to store.
+ * @param oid The [EMAIL PROTECTED] Identity} of the object to store.
+ * @param cld The [EMAIL PROTECTED]
org.apache.ojb.broker.metadata.ClassDescriptor} of the object.
+ * @param insert If <em>true</em> an insert operation will be performed,
else update operation.
+ * @param ignoreReferences With this flag the automatic storing/linking
+ * of references can be suppressed (independent of the used auto-update
setting in metadata),
+ * except [EMAIL PROTECTED]
org.apache.ojb.broker.metadata.SuperReferenceDescriptor}
+ * these kind of reference (descriptor) will always be performed. If
<em>true</em>
+ * all "normal" referenced objects will be ignored, only the specified
object is handled.
+ */
+ public void store(Object obj, Identity oid, ClassDescriptor cld,
boolean insert, boolean ignoreReferences);
+
+ /**
+ * Deletes the concrete representation of the specified object in the
underlying
+ * persistence system. This method is intended for use in top-level api
or
+ * by internal calls.
+ *
+ * @param obj The object to delete.
+ * @param ignoreReferences With this flag the automatic
deletion/unlinking
+ * of references can be suppressed (independent of the used auto-delete
setting in metadata),
+ * except [EMAIL PROTECTED]
org.apache.ojb.broker.metadata.SuperReferenceDescriptor}
+ * these kind of reference (descriptor) will always be performed. If
<em>true</em>
+ * all "normal" referenced objects will be ignored, only the specified
object is handled.
+ * @throws PersistenceBrokerException
+ */
+ public void delete(Object obj, boolean ignoreReferences) throws
PersistenceBrokerException;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]