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 2003/07/12 18:17:24 UTC
cvs commit: db-ojb/src/test/org/apache/ojb/broker PersistenceBrokerTest.java
arminw 2003/07/12 09:17:23
Modified: src/java/org/apache/ojb/broker/core
PersistenceBrokerImpl.java
src/java/org/apache/ojb/broker/util ObjectModification.java
src/test/org/apache/ojb/broker PersistenceBrokerTest.java
Log:
- rollback made changes. Do not use Identity
objects in markedForDelete list, because this
is a performance impact. Put the object itself
in the list again.
- Remove blank lines
- add test for double store/delete of objects
Revision Changes Path
1.27 +17 -12 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.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- PersistenceBrokerImpl.java 10 Jul 2003 22:05:17 -0000 1.26
+++ PersistenceBrokerImpl.java 12 Jul 2003 16:17:23 -0000 1.27
@@ -409,10 +409,13 @@
/**
* MBAIRD
* 1. if we are marked for delete already, avoid recursing on this object
+ *
+ * arminw:
+ * use object instead Identity object in markedForDelete List,
+ * because using objects we get a better performance. I can't find
+ * side-effects in doing so.
*/
- ClassDescriptor cld = descriptorRepository.getDescriptorFor(obj.getClass());
- Identity oid = new Identity(obj, this, cld);
- if (markedForDelete.contains(oid))
+ if (markedForDelete.contains(obj))
{
return;
}
@@ -420,7 +423,9 @@
* MBAIRD
* 2. register object in markedForDelete map.
*/
- markedForDelete.add(oid);
+ markedForDelete.add(obj);
+ ClassDescriptor cld = descriptorRepository.getDescriptorFor(obj.getClass());
+ Identity oid = new Identity(obj, this, cld);
// Invoke events on PersistenceBrokerAware instances and listeners
BEFORE_DELETE_EVENT.setTarget(obj);
fireBrokerEvent(BEFORE_DELETE_EVENT);
@@ -2516,16 +2521,16 @@
{
//look for a collection descriptor on left such as left.element-class-ref='right'
DescriptorRepository dr = getDescriptorRepository();
-
+
Object leftObject = m2nImpl.getLeftObject();
Class leftClass = leftObject.getClass();
Object rightObject = m2nImpl.getRightObject();
Class rightClass = rightObject.getClass();
-
+
logger.debug("Deleting MtoN implementor ["+leftClass+"] ["+rightClass+"]");
-
+
//
- //are written per class, maybe referencing abstract classes or interfaces
+ //are written per class, maybe referencing abstract classes or interfaces
//so let's look for collection descriptors on the left class and try to handle extents on teh right class
ClassDescriptor leftCld = dr.getDescriptorFor(leftClass);
ClassDescriptor rightCld = dr.getDescriptorFor(rightClass);
@@ -2547,7 +2552,7 @@
+"] right["+rightClass+"]");
}
-
+
if(leftObject == null || rightObject == null)
{
//TODO: to be implemented, must change MtoNImplementor
@@ -2559,14 +2564,14 @@
Object[] leftPkValues = brokerHelper.getKeyValues(leftCld, leftObject);
Object[] rightPkValues = brokerHelper.getKeyValues(rightCld,rightObject);
String[] pkLeftColumns = wanted.getFksToThisClass();
- String[] pkRightColumns = wanted.getFksToItemClass();
+ String[] pkRightColumns = wanted.getFksToItemClass();
String table = wanted.getIndirectionTable();
if(table == null) throw new PersistenceBrokerException("Can't remove MtoN implementor withou an indirection table");
String deleteStmt = sqlGenerator.getDeleteMNStatement(table, pkLeftColumns, pkRightColumns);
dbAccess.executeUpdateSQL(deleteStmt, leftCld, leftPkValues, rightPkValues);
}
}
-
+
/**
* @see org.apache.ojb.broker.PersistenceBroker#addMtoNImplementor()
*/
1.3 +22 -25 db-ojb/src/java/org/apache/ojb/broker/util/ObjectModification.java
Index: ObjectModification.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/util/ObjectModification.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ObjectModification.java 17 Jun 2002 19:34:24 -0000 1.2
+++ ObjectModification.java 12 Jul 2003 16:17:23 -0000 1.3
@@ -53,30 +53,27 @@
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
-
-
-/**
- *
- * The Interface ObjectModification represents information about
- * modifications of persistence capable objects.
- * Allows clients of the PersistenceBroker (e.g. a TransactionServer)
- * to interact with the Broker in order to generate optimized SQL Statements.
- *
- * @author Thomas Mahler
- * @version $Id$
- */
-public interface ObjectModification extends java.io.Serializable
-{
-
- /**
- * returns true if the underlying Object needs an INSERT statement.
- * else Returns false.
- */
+
+/**
+ *
+ * The Interface ObjectModification represents information about
+ * modifications of persistence capable objects.
+ * Allows clients of the PersistenceBroker (e.g. a TransactionServer)
+ * to interact with the Broker in order to generate optimized SQL Statements.
+ *
+ * @author Thomas Mahler
+ * @version $Id$
+ */
+public interface ObjectModification extends java.io.Serializable
+{
+ /**
+ * returns true if the underlying Object needs an INSERT statement.
+ * else Returns false.
+ */
public boolean needsInsert();
-
- /**
- * returns true if the underlying Object needs an UPDATE statement.
- * else Returns false.
- */
- public boolean needsUpdate();
+ /**
+ * returns true if the underlying Object needs an UPDATE statement.
+ * else Returns false.
+ */
+ public boolean needsUpdate();
}
1.27 +123 -16 db-ojb/src/test/org/apache/ojb/broker/PersistenceBrokerTest.java
Index: PersistenceBrokerTest.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/broker/PersistenceBrokerTest.java,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- PersistenceBrokerTest.java 23 Jun 2003 19:35:47 -0000 1.26
+++ PersistenceBrokerTest.java 12 Jul 2003 16:17:23 -0000 1.27
@@ -1,6 +1,7 @@
package org.apache.ojb.broker;
import junit.framework.TestCase;
+import org.apache.commons.lang.SerializationUtils;
import org.apache.ojb.broker.metadata.ClassDescriptor;
import org.apache.ojb.broker.query.Criteria;
import org.apache.ojb.broker.query.Query;
@@ -192,7 +193,7 @@
}
finally
{
- if(broker != null) broker.close();
+ if (broker != null) broker.close();
}
}
@@ -224,7 +225,7 @@
ProductGroup pg;
pg = new ProductGroup();
pg.setId(groupId);
-
+
Article a = createArticle(300 * testId);
a.setProductGroup(pg);
@@ -1157,7 +1158,7 @@
b = readArticleByIdentity(testId);
assertEquals("should be equal after update", newname, b.getArticleName());
}
-
+
/**
* test if reference to Proxy is updated
* @throws Exception
@@ -1165,29 +1166,135 @@
public void testUpdateReferencedProxy() throws Exception
{
int id = 11;
-
+
deleteArticle(testId);
- Article a = readArticleByIdentity(id);
- InterfaceProductGroup pga = a.getProductGroup();
+ Article a = readArticleByIdentity(id);
+ InterfaceProductGroup pga = a.getProductGroup();
Article b = createArticle(testId);
b.setProductGroup(pga);
storeArticle(b);
-
- broker.clearCache();
- b = readArticleByIdentity(testId);
- InterfaceProductGroup pgb = b.getProductGroup();
+
+ broker.clearCache();
+ b = readArticleByIdentity(testId);
+ InterfaceProductGroup pgb = b.getProductGroup();
assertEquals("should be equal after update", pga.getId(), pgb.getId());
-
+
// clear ProductGroup
- // this one fails because
+ // this one fails because
// fld.getPersistentField().set(obj, null) has a problem with primitives
- /*
+ /*
b.setProductGroup(null);
storeArticle(b);
-
- broker.clearCache();
- b = readArticleByIdentity(testId);
+
+ broker.clearCache();
+ b = readArticleByIdentity(testId);
assertEquals("should be null after update", null, b.getProductGroup());
*/
+ }
+
+ public void testChangeFieldsWhileStoringObject()
+ {
+ long timestamp = System.currentTimeMillis();
+
+ broker.beginTransaction();
+ Person p = new Person();
+ p.setFirstname("no_1_" + timestamp);
+ p.setLastname("no_1_" + timestamp);
+ broker.store(p);
+ // change fields
+ p.setFirstname("no_2_" + timestamp);
+ p.setLastname("no_2_" + timestamp);
+ // store changed object again
+ broker.store(p);
+ broker.commitTransaction();
+
+ Identity id = new Identity(p, broker);
+ Person result = (Person) broker.getObjectByIdentity(id);
+ assertNotNull(result);
+ assertEquals("no_2_" + timestamp, result.getFirstname());
+ assertEquals("no_2_" + timestamp, result.getLastname());
+
+ /*
+ same with cleared cache
+ */
+ timestamp = System.currentTimeMillis() + 1;
+ broker.beginTransaction();
+ p = new Person();
+ p.setFirstname("no_3_" + timestamp);
+ p.setLastname("no_3_" + timestamp);
+ broker.store(p);
+ broker.clearCache();
+ p.setFirstname("no_4_" + timestamp);
+ p.setLastname("no_4_" + timestamp);
+ broker.store(p);
+ broker.commitTransaction();
+
+ broker.clearCache();
+ id = new Identity(p, broker);
+ broker.clearCache();
+ result = (Person) broker.getObjectByIdentity(id);
+ assertNotNull(result);
+ assertEquals("no_4_" + timestamp, result.getFirstname());
+ assertEquals("no_4_" + timestamp, result.getLastname());
+ }
+
+ public void testDoubleStore()
+ {
+ long timestamp = System.currentTimeMillis();
+
+ Person person = new Person();
+ person.setFirstname("testDoubleStore_" + timestamp);
+ person.setLastname("time_" + timestamp);
+
+ broker.beginTransaction();
+ Identity oid = new Identity(person, broker);
+ Person serializedPerson = (Person) SerializationUtils.clone(person);
+
+ broker.store(person);
+ broker.store(person);
+ broker.store(serializedPerson);
+
+ broker.commitTransaction();
+
+ Criteria crit = new Criteria();
+ crit.addLike("firstName", "testDoubleStore_" + timestamp);
+ Query query = QueryFactory.newQuery(Person.class, crit);
+ Collection result = broker.getCollectionByQuery(query);
+
+ assertEquals("Expect to find exact 1 object", 1, result.size());
+ }
+
+ public void testDoubleDelete()
+ {
+ long timestamp = System.currentTimeMillis();
+
+ Person person = new Person();
+ person.setFirstname("testDoubleDelete_" + timestamp);
+ person.setLastname("time_" + timestamp);
+
+ broker.beginTransaction();
+ Identity oid = new Identity(person, broker);
+ Person serializedPerson = (Person) SerializationUtils.clone(person);
+ broker.store(person);
+ broker.commitTransaction();
+
+ Criteria crit = new Criteria();
+ crit.addLike("firstName", "testDoubleDelete_" + timestamp);
+ Query query = QueryFactory.newQuery(Person.class, crit);
+ Collection result = broker.getCollectionByQuery(query);
+ assertEquals("Expect to find exact 1 object", 1, result.size());
+
+ broker.beginTransaction();
+ broker.delete(person);
+ broker.delete(serializedPerson);
+ broker.delete(person);
+ broker.commitTransaction();
+
+ broker.beginTransaction();
+ broker.delete(serializedPerson);
+ broker.commitTransaction();
+
+ result = broker.getCollectionByQuery(query);
+ assertEquals("Expect to find none objects", 0, result.size());
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org