You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by bu...@apache.org on 2013/04/26 08:24:19 UTC

svn commit: r859958 - in /websites/staging/isis/trunk: cgi-bin/ content/ content/components/objectstores/jdo/workarounds.html

Author: buildbot
Date: Fri Apr 26 06:24:18 2013
New Revision: 859958

Log:
Staging update by buildbot for isis

Modified:
    websites/staging/isis/trunk/cgi-bin/   (props changed)
    websites/staging/isis/trunk/content/   (props changed)
    websites/staging/isis/trunk/content/components/objectstores/jdo/workarounds.html

Propchange: websites/staging/isis/trunk/cgi-bin/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Fri Apr 26 06:24:18 2013
@@ -1 +1 @@
-1470318
+1476062

Propchange: websites/staging/isis/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Fri Apr 26 06:24:18 2013
@@ -1 +1 @@
-1470318
+1476062

Modified: websites/staging/isis/trunk/content/components/objectstores/jdo/workarounds.html
==============================================================================
--- websites/staging/isis/trunk/content/components/objectstores/jdo/workarounds.html (original)
+++ websites/staging/isis/trunk/content/components/objectstores/jdo/workarounds.html Fri Apr 26 06:24:18 2013
@@ -240,7 +240,9 @@
 <p>There are a number of limitations in DataNucleus' implementation of JDO, specifically with regard to 1:m bidirectional relationships.  </p>
 
 <ul>
-<li>loading the children from the parent does not fire the <code>jdoPostLoad</code> callback (either on the entity via <code>javax.jdo.listener.LoadCallback</code> nor <code>javax.jdo.listener.LoadLifecycleListener</code>)</li>
+<li>loading the children from the parent does not fire the <code>jdoPostLoad</code> callback (either on the entity via <code>javax.jdo.listener.LoadCallback</code> nor <code>javax.jdo.listener.LoadLifecycleListener</code>)</p>
+
+<p>More precisely, this doesn't occur if the child being loaded has subclasses, and the subclasses has fields/properties that are part of the default fetch group.</li>
 <li>persisting a child entity does not cause the parent's collection to be updated.</p>
 
 <p>Note that this is documented behaviour; see this <a href="http://www.datanucleus.org/products/datanucleus/jdo/orm/relationships.html">DataNucleus page</a>.</li>
@@ -283,19 +285,29 @@ public void setIsisJdoSupport(IsisJdoSup
 
 <h2>Workaround for Lazy Loading</h2>
 
-<p>In a bidir 1:m, we have found that the post-load callback for the children is not fired.</p>
+<p>In a bidir 1:m, we have found that in certain circumstances the post-load callback for the children is not fired.  Specifically, if the child has subclasses, and the subclass has fields/properties that are in the <a href="http://db.apache.org/jdo/fetchgroups.html">default fetch group</a>.</p>
+
+<p>A test case illustrating the problem (<em>though whether with the spec or the DN implementation, we are not yet sure</em>) can be found <a href="https://github.com/danhaywood/test-jdo">here on github</a>.</p>
 
 <p>The consequence of this is that any domain services used by the child object (including <code>DomainObjectContainer</code>) are not injected into the child.</p>
 
 <p>The workaround is to have the parent inject the services when returning the children.</p>
 
-<p>For example, suppose we have a Customer &lt;->* Order bidir relationship.  In Customer, we would have:</p>
+<p>For example, suppose we have a <code>Customer</code> &lt;->* <code>Order</code> bidir relationship, and where <code>Order</code> my have subclasses, eg <code>RushedOrder</code>.  In <code>Customer</code>, we would add a new method <code>getOrdersWorkaround()</code>:</p>
 
 <pre><code>// {{ Orders (Collection)
 private SortedSet&lt;Order&gt; orders = new TreeSet&lt;Order&gt;();
 
 @Persistent(mappedBy = "customer")
 public SortedSet&lt;Order&gt; getOrders() {
+    return this.orders;
+}
+
+public void setOrders(final SortedSet&lt;Order&gt; orders) {
+    this.orders = orders;
+}
+
+public SortedSet&lt;Order&gt; getOrdersWorkaround() {
 
     if (this.orders == null) {
         // this can happen, it would seem, by JDO/DN when it is 
@@ -305,7 +317,7 @@ public SortedSet&lt;Order&gt; getOrders(
         // inject each element before returning it
         return Sets.newTreeSet(
             Iterables.transform(
-                this.orders, 
+                this.getOrders(), 
                 new Function&lt;Order, Order&gt;(){
                     public Order apply(Order order) {
                         return isisJdoSupport.injected(order);                        
@@ -313,10 +325,6 @@ public SortedSet&lt;Order&gt; getOrders(
                 }));
     }
 }
-
-public void setOrders(final SortedSet&lt;Order&gt; orders) {
-    this.orders = orders;
-}
 </code></pre>
 
 <p>Alternatively, you can reload each child object.  Change:</p>