arminw 2005/05/09 07:26:55
Modified: src/java/org/apache/ojb/broker/core Tag: OJB_1_0_RELEASE
MtoNBroker.java
src/java/org/apache/ojb/broker/util Tag: OJB_1_0_RELEASE
BrokerHelper.java
src/java/org/apache/ojb/broker Tag: OJB_1_0_RELEASE
MtoNImplementor.java
src/test/org/apache/ojb/broker Tag: OJB_1_0_RELEASE
MtoNTest.java
src/test/org/apache/ojb/odmg Tag: OJB_1_0_RELEASE
M2NTest.java
src/test/org/apache/ojb Tag: OJB_1_0_RELEASE
repository_junit_odmg.xml
Log:
- fix OJB-39, multiple m:n references problem when same referenced types are
used
- add new test, fix odmg test cases, fix mapping
Revision Changes Path
No revision
No revision
1.10.2.6 +3 -21
db-ojb/src/java/org/apache/ojb/broker/core/MtoNBroker.java
Index: MtoNBroker.java
===================================================================
RCS file:
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/MtoNBroker.java,v
retrieving revision 1.10.2.5
retrieving revision 1.10.2.6
diff -u -r1.10.2.5 -r1.10.2.6
--- MtoNBroker.java 18 Mar 2005 19:25:05 -0000 1.10.2.5
+++ MtoNBroker.java 9 May 2005 14:26:55 -0000 1.10.2.6
@@ -19,7 +19,6 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
-import java.util.Vector;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
@@ -265,8 +264,8 @@
// handle extents on teh right class
ClassDescriptor leftCld = dr.getDescriptorFor(leftClass);
ClassDescriptor rightCld = dr.getDescriptorFor(rightClass);
- Vector leftColds = leftCld.getCollectionDescriptors();
- CollectionDescriptor wanted = findCollectionDescriptor(leftClass,
rightClass, leftColds);
+ //Vector leftColds = leftCld.getCollectionDescriptors();
+ CollectionDescriptor wanted = m2nImpl.getLeftDescriptor();
if(leftObject == null || rightObject == null)
{
@@ -305,23 +304,6 @@
}
}
- private CollectionDescriptor findCollectionDescriptor(Class leftClass,
Class rightClass, Vector leftColds)
- {
- for(Iterator iter = leftColds.iterator(); iter.hasNext();)
- {
- CollectionDescriptor element = (CollectionDescriptor)
iter.next();
-
- //try super classes and interfaces too
- if(element.getItemClass().isAssignableFrom(rightClass))
- {
- //we found it !
- return element;
- }
- }
- throw new PersistenceBrokerException("Can't find reasonable
collection descriptor for MtoN implementor left[" + leftClass
- + "] right[" + rightClass + "]");
- }
-
private String[] mergeColumns(String[] first, String[] second)
{
String[] cols = new String[first.length + second.length];
No revision
No revision
1.57.2.15 +5 -5
db-ojb/src/java/org/apache/ojb/broker/util/BrokerHelper.java
Index: BrokerHelper.java
===================================================================
RCS file:
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/util/BrokerHelper.java,v
retrieving revision 1.57.2.14
retrieving revision 1.57.2.15
diff -u -r1.57.2.14 -r1.57.2.15
--- BrokerHelper.java 26 Apr 2005 03:41:36 -0000 1.57.2.14
+++ BrokerHelper.java 9 May 2005 14:26:55 -0000 1.57.2.15
@@ -916,7 +916,7 @@
{
if(cds.isMtoNRelation())
{
- m_broker.deleteMtoNImplementor(new MtoNImplementor(source,
referenceToUnlink));
+ m_broker.deleteMtoNImplementor(new MtoNImplementor(cds, source,
referenceToUnlink));
}
else
{
@@ -943,15 +943,15 @@
/**
* Link a single 1:n or m:n object.
*
- * @param source The source object with reference.
- * @param cds The [EMAIL PROTECTED]
org.apache.ojb.broker.metadata.CollectionDescriptor} of the relation.
+ * @param source The source object with the declared reference.
+ * @param cds The [EMAIL PROTECTED]
org.apache.ojb.broker.metadata.CollectionDescriptor} of the relation declared
in source object.
* @param referenceToLink The referenced object to link.
*/
public void link(Object source, CollectionDescriptor cds, Object
referenceToLink)
{
if(cds.isMtoNRelation())
{
- m_broker.addMtoNImplementor(new MtoNImplementor(source,
referenceToLink));
+ m_broker.addMtoNImplementor(new MtoNImplementor(cds, source,
referenceToLink));
}
else
{
No revision
No revision
1.7.2.3 +28 -116
db-ojb/src/java/org/apache/ojb/broker/MtoNImplementor.java
Index: MtoNImplementor.java
===================================================================
RCS file:
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/MtoNImplementor.java,v
retrieving revision 1.7.2.2
retrieving revision 1.7.2.3
diff -u -r1.7.2.2 -r1.7.2.3
--- MtoNImplementor.java 18 Mar 2005 19:25:05 -0000 1.7.2.2
+++ MtoNImplementor.java 9 May 2005 14:26:55 -0000 1.7.2.3
@@ -21,6 +21,8 @@
/**
* Helper class to handle single m:n relation entries (m:n indirection table
entries).
+ * <br/>
+ * The "left / right" notation is only used to differ both sides of the
relation.
*
* @author <a href="[EMAIL PROTECTED]">Leandro Rodrigo Saad Cruz</a>
* @version $Id$
@@ -31,46 +33,57 @@
private Object rightObject;
private Class leftClass;
private Class rightClass;
- //private CollectionDescriptor collectionDesc;
- //private PersistenceBroker broker;
+ private CollectionDescriptor leftDescriptor;
/**
* @deprecated
*/
- public MtoNImplementor(PersistenceBroker pb, CollectionDescriptor cod,
Object left, Object right)
+ public MtoNImplementor(PersistenceBroker pb, CollectionDescriptor
codLeft, Object left, Object right)
{
- init(left, right);
+ init(codLeft, left, right);
}
/**
- * @deprecated
+ * Constructor for m:n entry.
+ *
+ * @param pb Current used [EMAIL PROTECTED] PersistenceBroker} instance.
+ * @param leftFieldName Field name of the left m:n reference.
+ * @param left The left side object.
+ * @param right The right side object.
*/
- public MtoNImplementor(PersistenceBroker pb, String collectionName,
Object left, Object right)
+ public MtoNImplementor(PersistenceBroker pb, String leftFieldName,
Object left, Object right)
{
- //CollectionDescriptor cod =
pb.getClassDescriptor(ProxyHelper.getRealClass(leftObject)).getCollectionDescriptorByName(collectionName);
- init(left, right);
+ if(left == null || right == null)
+ {
+ throw new IllegalArgumentException("both objects must exist");
+ }
+ CollectionDescriptor cod =
pb.getClassDescriptor(ProxyHelper.getRealClass(left)).getCollectionDescriptorByName(leftFieldName);
+ init(cod, left, right);
}
- public MtoNImplementor(Object leftObject, Object rightObject)
+ public MtoNImplementor(CollectionDescriptor leftDescriptor, Object
leftObject, Object rightObject)
{
- init(leftObject, rightObject);
+ init(leftDescriptor, leftObject, rightObject);
}
- private void init(Object left, Object right)
+ private void init(CollectionDescriptor leftDescriptor, Object left,
Object right)
{
if(left == null || right == null)
{
throw new IllegalArgumentException("both objects must exist");
}
-
- //broker = pb;
- //collectionDesc = cod;
+ this.leftDescriptor = leftDescriptor;
leftObject = left;
rightObject = right;
leftClass = ProxyHelper.getRealClass(leftObject);
rightClass = ProxyHelper.getRealClass(rightObject);
}
+ public CollectionDescriptor getLeftDescriptor()
+ {
+ return leftDescriptor;
+ }
+
public Class getLeftClass()
{
return leftClass;
@@ -90,106 +103,5 @@
{
return rightObject;
}
-
-// public CollectionDescriptor getCollectionDescriptor()
-// {
-// return collectionDesc;
-// }
-
-// /**
-// *
-// * @param mnKeys
-// * @return
-// */
-// public String getInsertStmt(Collection mnKeys)
-// {
-// String[] leftPkColumns = collectionDesc.getFksToThisClass();
-// String[] rightPkColumns = collectionDesc.getFksToItemClass();
-// String table = collectionDesc.getIndirectionTable();
-// Key key = new Key(getRightPkValues());
-// if (mnKeys.contains(key))
-// {
-// return null;
-// }
-// return broker.serviceSqlGenerator().getInsertMNStatement(table,
leftPkColumns, rightPkColumns);
-// }
-
-
-// /**
-// *
-// * @return an Object Array with the primary key values of the left
object
-// */
-// public Object[] getLeftPkValues()
-// {
-// ClassDescriptor leftCld = broker.getClassDescriptor(leftClass);
-// BrokerHelper bh = broker.serviceBrokerHelper();
-// return bh.extractValueArray(bh.getKeyValues(leftCld,
leftObject));
-// }
-//
-// /**
-// *
-// * @return an Object Array with the primary key values of the right
object
-// */
-// public Object[] getRightPkValues()
-// {
-// ClassDescriptor rightCld =
broker.getClassDescriptor(rightClass);
-// BrokerHelper bh = broker.serviceBrokerHelper();
-// return bh.extractValueArray(bh.getKeyValues(rightCld,
rightObject));
-// }
-
-// /**
-// * Inner class to model the key
-// */
-// private static final class Key
-// {
-//
-// final Object[] m_key;
-//
-// Key(final Object[] aKey)
-// {
-// m_key = new Object[aKey.length];
-//
-// for (int i = 0; i < aKey.length; i++)
-// {
-// // BRJ:
-// // convert all Numbers to Long to simplify equals
-// // could lead to problems when Floats are used as key
-// if (aKey[i] instanceof Number)
-// {
-// m_key[i] = new Long(((Number)aKey[i]).longValue());
-// }
-// else
-// {
-// m_key[i] = aKey[i];
-// }
-// }
-// }
-//
-// public boolean equals(Object other)
-// {
-// if (other == this)
-// {
-// return true;
-// }
-// if (!(other instanceof Key))
-// {
-// return false;
-// }
-//
-// Key otherKey = (Key) other;
-// EqualsBuilder eb = new EqualsBuilder();
-//
-// eb.append(m_key, otherKey.m_key);
-// return eb.isEquals();
-// }
-//
-// public int hashCode()
-// {
-// HashCodeBuilder hb = new HashCodeBuilder();
-// hb.append(m_key);
-//
-// return hb.toHashCode();
-// }
-// }
}
No revision
No revision
1.15.2.4 +2 -2 db-ojb/src/test/org/apache/ojb/broker/MtoNTest.java
Index: MtoNTest.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/broker/MtoNTest.java,v
retrieving revision 1.15.2.3
retrieving revision 1.15.2.4
diff -u -r1.15.2.3 -r1.15.2.4
--- MtoNTest.java 18 Mar 2005 19:22:30 -0000 1.15.2.3
+++ MtoNTest.java 9 May 2005 14:26:55 -0000 1.15.2.4
@@ -366,7 +366,7 @@
Category categoryId1 = new Category(1);
- MtoNImplementor m2n = new MtoNImplementor(newsId2,categoryId1);
+ MtoNImplementor m2n = new MtoNImplementor(broker, "qualifiers",
newsId2, categoryId1);
broker.deleteMtoNImplementor(m2n);
broker.clearCache();
@@ -385,7 +385,7 @@
News newNews = (News) broker.getObjectByIdentity(id);
int size = newNews.getQualifiers().size();
- MtoNImplementor m2n = new MtoNImplementor(newsId2,categoryId2);
+ MtoNImplementor m2n = new MtoNImplementor(broker, "qualifiers",
newsId2,categoryId2);
broker.addMtoNImplementor(m2n);
broker.clearCache();
No revision
No revision
1.3.2.5 +104 -14 db-ojb/src/test/org/apache/ojb/odmg/M2NTest.java
Index: M2NTest.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/odmg/M2NTest.java,v
retrieving revision 1.3.2.4
retrieving revision 1.3.2.5
diff -u -r1.3.2.4 -r1.3.2.5
--- M2NTest.java 7 May 2005 20:04:47 -0000 1.3.2.4
+++ M2NTest.java 9 May 2005 14:26:55 -0000 1.3.2.5
@@ -12,9 +12,7 @@
import org.apache.ojb.broker.ManageableCollection;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.broker.PersistenceBrokerException;
-import org.apache.ojb.broker.M2NTest.Actor;
-import org.apache.ojb.broker.M2NTest.Movie;
-import org.apache.ojb.broker.M2NTest.MovieImpl;
+import org.apache.ojb.broker.OJBRuntimeException;
import org.apache.ojb.broker.metadata.ObjectReferenceDescriptor;
import org.apache.ojb.broker.query.Criteria;
import org.apache.ojb.broker.query.Query;
@@ -167,6 +165,75 @@
tx.commit();
}
+ public void testTwoMtoNRelationsInOneClass() throws Exception
+ {
+ String postfixId = "testTwoMtoNRelationsInOneClass_" +
System.currentTimeMillis();
+ Movie m = new MovieImpl(postfixId, "Movie_" + postfixId, "none");
+
+ Actor a1 = new Actor("Actor_1_" + postfixId);
+ m.addActors(a1);
+
+ Actor a2a = new Actor("Actor_2a_" + postfixId);
+ m.addActors2(a2a);
+ Actor a2b = new Actor("Actor_2b_" + postfixId);
+ m.addActors2(a2b);
+
+ TransactionExt tx = (TransactionExt) odmg.newTransaction();
+ tx.begin();
+ database.makePersistent(m);
+ tx.commit();
+
+ tx.begin();
+ tx.getBroker().clearCache();
+
+ OQLQuery queryMovie = movieQuery(postfixId);
+ Collection resultMovie = (Collection) queryMovie.execute();
+ assertEquals(1, resultMovie.size());
+ Movie newMovie = (Movie) resultMovie.iterator().next();
+ assertNotNull(newMovie.getActors());
+ assertEquals(1, newMovie.getActors().size());
+ assertEquals(2, newMovie.getActors2().size());
+
+ OQLQuery queryActor = actorQuery(postfixId);
+ Collection resultActor = (Collection) queryActor.execute();
+ assertEquals(1 + 2, resultActor.size());
+
+ OQLQuery queryRole = roleQuery(null, m);
+ Collection resultRole = (Collection) queryRole.execute();
+ assertEquals(1, resultRole.size());
+
+ // remove both Actors from relation and delete one Actor
+ // instance completely, the other Actor should still in DB
+ Object removed1 = newMovie.getActors2().remove(0);
+ Actor removed2 = (Actor) newMovie.getActors2().remove(0);
+ database.deletePersistent(removed1);
+ // update the Actor unlinked from relation
+ tx.lock(removed2, Transaction.WRITE);
+ String newName = removed2.getName() + "_updated";
+ removed2.setName(newName);
+ tx.commit();
+
+ queryMovie = movieQuery(postfixId);
+ resultMovie = (Collection) queryMovie.execute();
+ assertEquals(1, resultMovie.size());
+ newMovie = (Movie) resultMovie.iterator().next();
+ assertNotNull(newMovie.getActors());
+ assertEquals(1, newMovie.getActors().size());
+ assertEquals(0, newMovie.getActors2().size());
+
+ queryActor = actorQuery(postfixId);
+ resultActor = (Collection) queryActor.execute();
+ assertEquals(1 + 1, resultActor.size());
+
+ queryActor = actorQuery(newName);
+ resultActor = (Collection) queryActor.execute();
+ assertEquals(1, resultActor.size());
+
+ queryRole = roleQuery(null, m);
+ resultRole = (Collection) queryRole.execute();
+ assertEquals(1, resultRole.size());
+ }
+
public void testStore() throws Exception
{
// arminw: fixed
@@ -254,7 +321,7 @@
OQLQuery queryActor = actorQuery(postfix);
Collection resultActor = (Collection) queryActor.execute();
- assertEquals(3, resultActor.size());
+ assertEquals(5, resultActor.size());
OQLQuery queryRole = roleQuery(null, movie);
Collection resultRole = (Collection) queryRole.execute();
@@ -443,7 +510,7 @@
OQLQuery queryActor = actorQuery(postfix);
Collection resultActor = (Collection) queryActor.execute();
- assertEquals(3, resultActor.size());
+ assertEquals(5, resultActor.size());
OQLQuery queryRole = roleQuery(null, movie);
Collection resultRole = (Collection) queryRole.execute();
@@ -480,7 +547,7 @@
queryActor = actorQuery(postfix);
resultActor = (Collection) queryActor.execute();
- assertEquals(2, resultActor.size());
+ assertEquals(4, resultActor.size());
queryRole = roleQuery(null, movie);
resultRole = (Collection) queryRole.execute();
@@ -527,7 +594,7 @@
OQLQuery queryActor = actorQuery(postfix);
Collection resultActor = (Collection) queryActor.execute();
- assertEquals(3, resultActor.size());
+ assertEquals(5, resultActor.size());
OQLQuery queryRole = roleQuery(null, movie);
Collection resultRole = (Collection) queryRole.execute();
@@ -575,7 +642,7 @@
// we only remove the association
queryActor = actorQuery(postfix);
resultActor = (Collection) queryActor.execute();
- assertEquals(3, resultActor.size());
+ assertEquals(5, resultActor.size());
tx.commit();
}
@@ -876,11 +943,14 @@
public static interface Movie
{
+ public void addActors(Actor actor);
+ public void addActors2(Actor actor);
+
public Collection getActors();
public void setActors(Collection actors);
- public Collection getActors2();
- public void setActors2(Collection actors);
+ public List getActors2();
+ public void setActors2(List actors);
public Integer getIdInt2();
public Integer getIdInt();
@@ -906,7 +976,7 @@
private String title;
private String description;
private Collection actors;
- private Collection actors2;
+ private List actors2;
public MovieImpl()
{
@@ -919,6 +989,26 @@
this.description = description;
}
+ public void addActors(Actor actor)
+ {
+ if(actors == null)
+ {
+ actors = new ArrayList();
+ }
+ if(!actors.contains(actor)) actors.add(actor);
+ else throw new OJBRuntimeException("Can't add same object
twice");
+ }
+
+ public void addActors2(Actor actor)
+ {
+ if(actors2 == null)
+ {
+ actors2 = new ArrayList();
+ }
+ if(!actors2.contains(actor)) actors2.add(actor);
+ else throw new OJBRuntimeException("Can't add same object
twice");
+ }
+
public Collection getActors()
{
return actors;
@@ -929,12 +1019,12 @@
this.actors = actors;
}
- public Collection getActors2()
+ public List getActors2()
{
return actors2;
}
- public void setActors2(Collection actors)
+ public void setActors2(List actors)
{
this.actors2 = actors;
}
No revision
No revision
1.13.2.12 +3 -2 db-ojb/src/test/org/apache/ojb/repository_junit_odmg.xml
Index: repository_junit_odmg.xml
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/repository_junit_odmg.xml,v
retrieving revision 1.13.2.11
retrieving revision 1.13.2.12
diff -u -r1.13.2.11 -r1.13.2.12
--- repository_junit_odmg.xml 7 May 2005 20:04:47 -0000 1.13.2.11
+++ repository_junit_odmg.xml 9 May 2005 14:26:55 -0000 1.13.2.12
@@ -1205,7 +1205,8 @@
<collection-descriptor
name="actors2"
- element-class-ref="org.apache.ojb.broker.M2NTest$Actor"
+
collection-class="org.apache.ojb.broker.util.collections.ManageableArrayList"
+ element-class-ref="org.apache.ojb.odmg.M2NTest$Actor"
indirection-table="M2N_TEST_ROLE_2"
proxy="false"
auto-retrieve="true"
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]