Hi Michael,

I've assigned JDO-69 to you.

-- Michelle

Craig Russell wrote:

Hi Michelle,

Michael and I were talking this morning about a related issue with reading an object model and making some of the instances persistent. The test case we were talking about was the CompletenessTest but the results were relevant.

What we decided as an approach is to define another object in the bean xml file called "root". This object is a List that contains all of the objects to become persistent. In the case of the CompletenessTest with no relationships, we need this to be able to instantiate instances of Company, Department, PartTimeEmployee, FullTimeEmployee, MedicalInsurance, DentalInsurance, and Project and individually persist them and compare them. We don't need to persist the Address because these are embedded.

We discussed using this same approach for the QueryTest as well. Michael said he would look into modifying the query test to use the same pattern, and see if both tests could use the same company.xml input files.

Considering persistence by reachability, the only objects needed in the "root" list is the root of the connected objects. I think in the case of the query test, it is the single object "dept1" that is in the "root" list. I suppose it can't hurt to have emp1, emp2, and emp3 in the root list as well, but it is only needed if the implementation has a bug in persistence by reachability.

I don't think we need an "isEmbedded" feature in the CompanyModelReader.

Craig

On Jul 12, 2005, at 2:47 PM, Michelle Caisse wrote:

Hi,

JDO-69 describes a test error that occurs when the test attempts to make an embedded class persistent. The solution that I propose is an extension of one we previously implemented for tearDownClasses In this case, I propose adding to CompanyModelReader an array containing the embedded classes for the model and a boolean method isEmbedded(Class). In QueryTest, I check if the class is embedded before making it persistent. See the attached patch.

The concern that I have about this solution is that it only works for a particular mapping of the company model.

The proposed solution fixes most of the 17 errors caused by this issue under application identity. Under datastore identity, the affected tests produce a different error -- the implementation expects an identity field for the embedded Address class (JDO-83).

-- Michelle
Index: test/java/org/apache/jdo/tck/pc/company/CompanyModelReader.java
===================================================================
--- test/java/org/apache/jdo/tck/pc/company/CompanyModelReader.java (revision 215964) +++ test/java/org/apache/jdo/tck/pc/company/CompanyModelReader.java (working copy)
@@ -48,7 +48,7 @@
         Project.class
     };

- /** All classes in the model + /** Non-embedded classes in the model */
     private static final Class[] tearDownClasses = new Class[] {
         DentalInsurance.class, MedicalInsurance.class,
@@ -56,6 +56,12 @@
         Project.class, Department.class, Company.class
     };

+ /** Embedded classes in the model + */
+    private static final Class[] embeddedClasses = new Class[] {
+        Address.class
+    };
+ /** * Create a CompanyModelReader for the specified resourceName. * @param resourceName the name of the resource
@@ -240,5 +246,17 @@
     public Class[] getTearDownClasses() {
         return tearDownClasses;
     }
+ + /**
+     * @return Returns true if class is embedded.
+     */
+    public boolean isEmbedded(Class c) {
+        for (int i=0; i < embeddedClasses.length; i++) {
+            if (c.equals(embeddedClasses[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
 }

Index: test/java/org/apache/jdo/tck/query/QueryTest.java
===================================================================
--- test/java/org/apache/jdo/tck/query/QueryTest.java (revision 215964)
+++ test/java/org/apache/jdo/tck/query/QueryTest.java    (working copy)
@@ -126,7 +126,9 @@
         String[] names = reader.getBeanDefinitionNames();
         for (int i = 0; i < names.length; i++) {
             Object bean = reader.getBean(names[i]);
-            pm.makePersistent(bean);
+            if (!reader.isEmbedded(bean.getClass())) {
+                pm.makePersistent(bean);
+            }
             if (debug) logger.debug("inserted " + bean);
         }
         tx.commit();


Craig Russell

Architect, Sun Java Enterprise System http://java.sun.com/products/jdo

408 276-5638 mailto:[EMAIL PROTECTED]

P.S. A good JDO? O, Gasp!



Reply via email to