You are viewing a plain text version of this content. The canonical link for it is here.
Posted to general@db.apache.org by an...@apache.org on 2014/01/05 11:08:46 UTC
svn commit: r892842 [3/15] - in /websites/production/db/content/jdo: ./
guides/ releases/
Modified: websites/production/db/content/jdo/attach_detach.html
==============================================================================
--- websites/production/db/content/jdo/attach_detach.html (original)
+++ websites/production/db/content/jdo/attach_detach.html Sun Jan 5 10:08:45 2014
@@ -1,5 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.3 at Nov 4, 2013 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.3 at Jan 5, 2014 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -11,7 +11,7 @@
@import url("./css/site.css");
</style>
<link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
- <meta name="Date-Revision-yyyymmdd" content="20131104" />
+ <meta name="Date-Revision-yyyymmdd" content="20140105" />
<meta http-equiv="Content-Language" content="en" />
</head>
@@ -101,7 +101,7 @@
<li class="none">
<a href="field_types.html" title="Types of Fields">Types of Fields</a>
</li>
- <li class="collapsed">
+ <li class="collapsed">
<a href="metadata.html" title="MetaData">MetaData</a>
</li>
<li class="none">
@@ -209,235 +209,235 @@
</div>
<div id="bodyColumn">
<div id="contentBox">
-
-
- <div class="section"><h2>JDO Attach/Detach<a name="JDO_AttachDetach"></a></h2>
- <p>
- JDO provides an interface to the persistence of objects. JDO 1.0 doesn't provide a way of taking
- an object that was just persisted and just work on it and update the persisted object later.
- The user has to copy the fields manually and copy them back to the persisted object later.
- JDO 2.0 introduces a new way of handling this situation, by <b>detaching</b> an object from the
- persistence graph, allowing it to be worked on in the users application. It can then be
- <b>attached</b> to the persistence graph later.
- Please refer to <a href="state_transition.html">Object Lifecycle</a> for where this fits in.
- The first thing to do to use a class with this facility is to tag it as "detachable".
- This is done by adding the attribute
- </p>
- <div class="source"><pre><class name="MyClass" detachable="true"></pre></div>
- <p>
- This acts as an instruction to the <a href="enhancement.html">enhancement process</a> to add
- methods necessary to utilise the attach/detach process.
- </p>
-
- <p>
- The following code fragment highlights how to use the attach/detach mechanism
- </p>
- <div class="source"><pre>
-Product working_product=null;
-Transaction tx=pm.currentTransaction();
-try
-{
- tx.begin();
-
- Product prod=new Product(name,description,price);
- pm.makePersistent(prod);
-
- // Detach the product for use
- working_product = (Product)pm.detachCopy(prod);
-
- tx.commit();
-}
-catch (Exception e)
-{
- // Handle the exception
-}
-finally
-{
- if (tx.isActive())
- {
- tx.rollback();
- }
-}
-
-// Work on the detached object in our application
-working_product.setPrice(new_price);
-
-...
-
-// Reattach the updated object
-tx = pm.currentTransaction();
-try
-{
- tx.begin();
-
- Product attached_product = pm.makePersistent(working_product);
-
- tx.commit();
-}
-catch (Exception e)
-{
- // Handle the exception
-}
-finally
-{
- if (tx.isActive())
- {
- tx.rollback();
- }
-}</pre></div>
- <p>
- So we now don't need to do any manual copying of object fields just using a simple call to
- detach the object, and then attach it again later. Here are a few things to note with
- <i>attach/detach</i> :-
- </p>
- <ul>
- <li>Calling <i>detachCopy</i> on an object that is not detachable will return a <b>transient</b>
- instance that is a COPY of the original, so use the COPY thereafter.</li>
- <li>Calling <i>detachCopy</i> on an object that is detachable will return a <b>detached</b>
- instance that is a COPY of the original, so use this COPY thereafter</li>
- <li>A <i>detached</i> object retain the id of its datastore entity. Detached objects should be used
- where you want to update the objects and attach them later (updating the associated object in the
- datastore. If you want to create copies of the objects in the datastore with their own identities
- you should use <i>makeTransient</i> instead of <i>detachCopy</i>.</li>
- <li>Calling <i>detachCopy</i> will detach all fields of that object that are in the current
- <a href="fetchgroups.html">Fetch Group</a> for that class for that <i>PersistenceManager</i>.</li>
- <li>By default the fields of the object that will be detached are those in the <i>Default Fetch Group</i>.</li>
- <li>You should choose your <a href="fetchgroups.html">Fetch Group</a> carefully, bearing in mind which
- object(s) you want to access whilst detached. Detaching a relation field will detach the related object
- as well.</li>
- <li>If you don't detach a field of an object, you <u>cannot</u> access the value for that field while
- the object is detached.</li>
- <li>If you don't detach a field of an object, you <u>can</u> update the value for that field while detached,
- and thereafter you can access the value for that field.</li>
- <li>Calling <i>makePersistent</i> will return an (attached) copy of the detached object. It will attach all fields that
- were originally detached, and will also attach any other fields that were modified whilst detached.</li>
- </ul>
-
- <a name="detach_all_on_commit"></a>
- <div class="section"><h3>Detach All On Commit<a name="Detach_All_On_Commit"></a></h3>
- <p>
- JDO2 also provides a mechanism whereby all objects that were enlisted in a transaction are
- automatically detached when the transaction is committed. You can enable this in one of 3 ways.
- If you want to use this mode globally for all <i>PersistenceManager</i>s (PMs) from a
- <i>PersistenceManagerFactory</i> (PMF) you could either set the PMF property
- "datanucleus.DetachAllOnCommit", or you could create your PMF and call the PMF method
- <b>setDetachAllOnCommit(true)</b>. If instead you wanted to use this mode only for a particular
- PM, or only for a particular transaction for a particular PM, then you can call the PM method
- <b>setDetachAllOnCommit(true)</b> before the commit of the transaction, and it will apply for all
- transaction commits thereafter, until turned off (<b>setDetachAllOnCommit(false)</b>.
- Here's an example
- </p>
- <div class="source"><pre>
-// Create a PMF
-...
-
-// Create an object
-MyObject my = new MyObject();
-
-PersistenceManager pm = pmf.getPersistenceManager();
-Transaction tx = pm.currentTransaction();
-try
-{
- tx.begin();
-
- // We want our object to be detached when it's been persisted
- pm.setDetachAllOnCommit(true);
-
- // Persist the object that we created earlier
- pm.makePersistent(my);
-
- tx.commit();
- // The object "my" is now in detached state and can be used further
-}
-finally
-{
- if (tx.isActive)
- {
- tx.rollback();
- }
-}</pre></div>
- <br />
- </div>
-
- <a name="copy_on_attach"></a>
- <div class="section"><h3>Copy On Attach<a name="Copy_On_Attach"></a></h3>
- <p>
- By default when you are attaching a detached object it will return an attached copy
- of the detached object. JDO2.1 provides a new feature that allows this attachment to
- just migrate the existing detached object into attached state.
- </p>
- <p>
- You enable this by setting the <i>PersistenceManagerFactory</i> (PMF) property
- <b>datanucleus.CopyOnAttach</b> to false. Alternatively you can use the methods
- <i>PersistenceManagerFactory.setCopyOnAttach(boolean flag)</i> or
- <i>PersistenceManager.setCopyOnAttach(boolean flag)</i>.
- If we return to the example at the start of this page, this now becomes
- </p>
- <div class="source"><pre>
-// Reattach the updated object
-pm.setCopyOnAttach(false);
-tx = pm.currentTransaction();
-try
-{
- tx.begin();
-
- // working product is currently in detached state
-
- pm.makePersistent(working_product);
- // working_product is now in persistent (attached) state
-
- tx.commit();
-}
-catch (Exception e)
-{
- // Handle the exception
-}
-finally
-{
- if (tx.isActive())
- {
- tx.rollback();
- }
-}</pre></div>
- <p>
- Please note that if you try to attach two detached objects representing the same underlying
- persistent object within the same transaction (i.e a persistent object with the same identity
- already exists in the level 1 cache), then a JDOUserException will be thrown.
- </p>
- <br />
- </div>
-
- <div class="section"><h3>Serialization of Detachable classes<a name="Serialization_of_Detachable_classes"></a></h3>
- <p>
- During enhancement of Detachable classes, a field called <i>jdoDetachedState</i> is added to
- the class definition. This field allows reading and changing tracking of detached objects
- while they are not managed by a PersistenceManager.
- </p>
- <p>
- When serialization occurs on a Detachable object, the <i>jdoDetachedState</i> field is written
- to the serialized object stream. On deserialize, this field is written back to the new
- deserialized instance. This process occurs transparently to the application. However, if
- deserialization occurs with an un-enhanced version of the class, the detached state is lost.
- </p>
- <p>
- Serialization and deserialization of Detachable classes and un-enhanced versions of the same
- class is only possible if the field <i>serialVersionUID</i> is added. It's recommended during
- development of the class, to define the <i>serialVersionUID</i> and make the class to implement
- the <i>java.io.Serializable</i> interface, as the following example:
- </p>
-<div class="source"><pre>
-class MyClass implements java.io.Serializable
-{
- private static final long serialVersionUID = 2765740961462495537L; // any random value here
-
- //.... other fields
-}
-</pre></div>
- <br />
- </div>
- </div>
-
-
+
+
+ <div class="section"><h2>JDO Attach/Detach<a name="JDO_AttachDetach"></a></h2>
+ <p>
+ JDO provides an interface to the persistence of objects. JDO 1.0 doesn't provide a way of taking
+ an object that was just persisted and just work on it and update the persisted object later.
+ The user has to copy the fields manually and copy them back to the persisted object later.
+ JDO 2.0 introduces a new way of handling this situation, by <b>detaching</b> an object from the
+ persistence graph, allowing it to be worked on in the users application. It can then be
+ <b>attached</b> to the persistence graph later.
+ Please refer to <a href="state_transition.html">Object Lifecycle</a> for where this fits in.
+ The first thing to do to use a class with this facility is to tag it as "detachable".
+ This is done by adding the attribute
+ </p>
+ <div class="source"><pre><class name="MyClass" detachable="true"></pre></div>
+ <p>
+ This acts as an instruction to the <a href="enhancement.html">enhancement process</a> to add
+ methods necessary to utilise the attach/detach process.
+ </p>
+
+ <p>
+ The following code fragment highlights how to use the attach/detach mechanism
+ </p>
+ <div class="source"><pre>
+Product working_product=null;
+Transaction tx=pm.currentTransaction();
+try
+{
+ tx.begin();
+
+ Product prod=new Product(name,description,price);
+ pm.makePersistent(prod);
+
+ // Detach the product for use
+ working_product = (Product)pm.detachCopy(prod);
+
+ tx.commit();
+}
+catch (Exception e)
+{
+ // Handle the exception
+}
+finally
+{
+ if (tx.isActive())
+ {
+ tx.rollback();
+ }
+}
+
+// Work on the detached object in our application
+working_product.setPrice(new_price);
+
+...
+
+// Reattach the updated object
+tx = pm.currentTransaction();
+try
+{
+ tx.begin();
+
+ Product attached_product = pm.makePersistent(working_product);
+
+ tx.commit();
+}
+catch (Exception e)
+{
+ // Handle the exception
+}
+finally
+{
+ if (tx.isActive())
+ {
+ tx.rollback();
+ }
+}</pre></div>
+ <p>
+ So we now don't need to do any manual copying of object fields just using a simple call to
+ detach the object, and then attach it again later. Here are a few things to note with
+ <i>attach/detach</i> :-
+ </p>
+ <ul>
+ <li>Calling <i>detachCopy</i> on an object that is not detachable will return a <b>transient</b>
+ instance that is a COPY of the original, so use the COPY thereafter.</li>
+ <li>Calling <i>detachCopy</i> on an object that is detachable will return a <b>detached</b>
+ instance that is a COPY of the original, so use this COPY thereafter</li>
+ <li>A <i>detached</i> object retain the id of its datastore entity. Detached objects should be used
+ where you want to update the objects and attach them later (updating the associated object in the
+ datastore. If you want to create copies of the objects in the datastore with their own identities
+ you should use <i>makeTransient</i> instead of <i>detachCopy</i>.</li>
+ <li>Calling <i>detachCopy</i> will detach all fields of that object that are in the current
+ <a href="fetchgroups.html">Fetch Group</a> for that class for that <i>PersistenceManager</i>.</li>
+ <li>By default the fields of the object that will be detached are those in the <i>Default Fetch Group</i>.</li>
+ <li>You should choose your <a href="fetchgroups.html">Fetch Group</a> carefully, bearing in mind which
+ object(s) you want to access whilst detached. Detaching a relation field will detach the related object
+ as well.</li>
+ <li>If you don't detach a field of an object, you <u>cannot</u> access the value for that field while
+ the object is detached.</li>
+ <li>If you don't detach a field of an object, you <u>can</u> update the value for that field while detached,
+ and thereafter you can access the value for that field.</li>
+ <li>Calling <i>makePersistent</i> will return an (attached) copy of the detached object. It will attach all fields that
+ were originally detached, and will also attach any other fields that were modified whilst detached.</li>
+ </ul>
+
+ <a name="detach_all_on_commit"></a>
+ <div class="section"><h3>Detach All On Commit<a name="Detach_All_On_Commit"></a></h3>
+ <p>
+ JDO2 also provides a mechanism whereby all objects that were enlisted in a transaction are
+ automatically detached when the transaction is committed. You can enable this in one of 3 ways.
+ If you want to use this mode globally for all <i>PersistenceManager</i>s (PMs) from a
+ <i>PersistenceManagerFactory</i> (PMF) you could either set the PMF property
+ "datanucleus.DetachAllOnCommit", or you could create your PMF and call the PMF method
+ <b>setDetachAllOnCommit(true)</b>. If instead you wanted to use this mode only for a particular
+ PM, or only for a particular transaction for a particular PM, then you can call the PM method
+ <b>setDetachAllOnCommit(true)</b> before the commit of the transaction, and it will apply for all
+ transaction commits thereafter, until turned off (<b>setDetachAllOnCommit(false)</b>.
+ Here's an example
+ </p>
+ <div class="source"><pre>
+// Create a PMF
+...
+
+// Create an object
+MyObject my = new MyObject();
+
+PersistenceManager pm = pmf.getPersistenceManager();
+Transaction tx = pm.currentTransaction();
+try
+{
+ tx.begin();
+
+ // We want our object to be detached when it's been persisted
+ pm.setDetachAllOnCommit(true);
+
+ // Persist the object that we created earlier
+ pm.makePersistent(my);
+
+ tx.commit();
+ // The object "my" is now in detached state and can be used further
+}
+finally
+{
+ if (tx.isActive)
+ {
+ tx.rollback();
+ }
+}</pre></div>
+ <br />
+ </div>
+
+ <a name="copy_on_attach"></a>
+ <div class="section"><h3>Copy On Attach<a name="Copy_On_Attach"></a></h3>
+ <p>
+ By default when you are attaching a detached object it will return an attached copy
+ of the detached object. JDO2.1 provides a new feature that allows this attachment to
+ just migrate the existing detached object into attached state.
+ </p>
+ <p>
+ You enable this by setting the <i>PersistenceManagerFactory</i> (PMF) property
+ <b>datanucleus.CopyOnAttach</b> to false. Alternatively you can use the methods
+ <i>PersistenceManagerFactory.setCopyOnAttach(boolean flag)</i> or
+ <i>PersistenceManager.setCopyOnAttach(boolean flag)</i>.
+ If we return to the example at the start of this page, this now becomes
+ </p>
+ <div class="source"><pre>
+// Reattach the updated object
+pm.setCopyOnAttach(false);
+tx = pm.currentTransaction();
+try
+{
+ tx.begin();
+
+ // working product is currently in detached state
+
+ pm.makePersistent(working_product);
+ // working_product is now in persistent (attached) state
+
+ tx.commit();
+}
+catch (Exception e)
+{
+ // Handle the exception
+}
+finally
+{
+ if (tx.isActive())
+ {
+ tx.rollback();
+ }
+}</pre></div>
+ <p>
+ Please note that if you try to attach two detached objects representing the same underlying
+ persistent object within the same transaction (i.e a persistent object with the same identity
+ already exists in the level 1 cache), then a JDOUserException will be thrown.
+ </p>
+ <br />
+ </div>
+
+ <div class="section"><h3>Serialization of Detachable classes<a name="Serialization_of_Detachable_classes"></a></h3>
+ <p>
+ During enhancement of Detachable classes, a field called <i>jdoDetachedState</i> is added to
+ the class definition. This field allows reading and changing tracking of detached objects
+ while they are not managed by a PersistenceManager.
+ </p>
+ <p>
+ When serialization occurs on a Detachable object, the <i>jdoDetachedState</i> field is written
+ to the serialized object stream. On deserialize, this field is written back to the new
+ deserialized instance. This process occurs transparently to the application. However, if
+ deserialization occurs with an un-enhanced version of the class, the detached state is lost.
+ </p>
+ <p>
+ Serialization and deserialization of Detachable classes and un-enhanced versions of the same
+ class is only possible if the field <i>serialVersionUID</i> is added. It's recommended during
+ development of the class, to define the <i>serialVersionUID</i> and make the class to implement
+ the <i>java.io.Serializable</i> interface, as the following example:
+ </p>
+<div class="source"><pre>
+class MyClass implements java.io.Serializable
+{
+ private static final long serialVersionUID = 2765740961462495537L; // any random value here
+
+ //.... other fields
+}
+</pre></div>
+ <br />
+ </div>
+ </div>
+
+
</div>
</div>
@@ -446,7 +446,7 @@ class MyClass implements java.io.Seriali
</div>
<div id="footer">
<div class="xright">
- Copyright © 2005-2013.
+ Copyright © 2005-2014.
All Rights Reserved.
</div>
Modified: websites/production/db/content/jdo/class_types.html
==============================================================================
--- websites/production/db/content/jdo/class_types.html (original)
+++ websites/production/db/content/jdo/class_types.html Sun Jan 5 10:08:45 2014
@@ -1,5 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.3 at Nov 4, 2013 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.3 at Jan 5, 2014 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -11,7 +11,7 @@
@import url("./css/site.css");
</style>
<link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
- <meta name="Date-Revision-yyyymmdd" content="20131104" />
+ <meta name="Date-Revision-yyyymmdd" content="20140105" />
<meta http-equiv="Content-Language" content="en" />
</head>
@@ -101,7 +101,7 @@
<li class="none">
<a href="field_types.html" title="Types of Fields">Types of Fields</a>
</li>
- <li class="collapsed">
+ <li class="collapsed">
<a href="metadata.html" title="MetaData">MetaData</a>
</li>
<li class="none">
@@ -209,64 +209,64 @@
</div>
<div id="bodyColumn">
<div id="contentBox">
-
-
- <div class="section"><h2>JDO Class Types<a name="JDO_Class_Types"></a></h2>
- <p>
- JDO provides a means of transparent persistence of objects of user defined classes. With JDO there are actually
- 3 types of classes.
- </p>
- <ul>
- <li><b>Persistence Capable</b> classes are classes whose instances can be persisted to a datastore. JDO provide the
- mechanism for persisting these instances, and they are core to JDO. These classes need to be <i>enhanced</i>
- according to a JDO Meta-Data specification before use within a JDO environment.</li>
- <li><b>Persistence Aware</b> classes are classes that manipulate Persistence Capable instances through direct attribute
- manipulation. These classes are typically enhanced with very minimal JDO Meta-Data. The enhancement process performs very
- little changes to these classes.</li>
- <li><b>Normal</b> classes are classes that aren't themselves persistable, and have no knowledge of persistence either.
- These classes are totally unchanged in JDO, and require no JDO Meta-Data whatsoever.</li>
- </ul>
-
- <div class="section"><h3>PersistenceCapable<a name="PersistenceCapable"></a></h3>
- <p>
- Classes are defined as <b>PersistenceCapable</b> either by XML MetaData, like this
- </p>
- <div class="source"><pre>
-<class name="MyClass">
- ...
-</class></pre></div>
- <p>
- or, in JDO2.1, using Annotations. Like this
- </p>
- <div class="source"><pre>
-@PersistenceCapable
-public class MyClass
-{
- ...
-}</pre></div>
- <br />
- </div>
-
- <div class="section"><h3>PersistenceAware<a name="PersistenceAware"></a></h3>
- <p>
- Classes are defined as <b>PersistenceAware</b> either by XML MetaData, like this
- </p>
- <div class="source"><pre>
-<class name="MyClass" persistence-modifier="persistence-aware"/></pre></div>
- <p>
- or, in JDO2.1, using Annotations. Like this
- </p>
- <div class="source"><pre>
-@PersistenceAware
-public class MyClass
-{
- ...
-}</pre></div>
- <br />
- </div>
- </div>
-
-
+
+
+ <div class="section"><h2>JDO Class Types<a name="JDO_Class_Types"></a></h2>
+ <p>
+ JDO provides a means of transparent persistence of objects of user defined classes. With JDO there are actually
+ 3 types of classes.
+ </p>
+ <ul>
+ <li><b>Persistence Capable</b> classes are classes whose instances can be persisted to a datastore. JDO provide the
+ mechanism for persisting these instances, and they are core to JDO. These classes need to be <i>enhanced</i>
+ according to a JDO Meta-Data specification before use within a JDO environment.</li>
+ <li><b>Persistence Aware</b> classes are classes that manipulate Persistence Capable instances through direct attribute
+ manipulation. These classes are typically enhanced with very minimal JDO Meta-Data. The enhancement process performs very
+ little changes to these classes.</li>
+ <li><b>Normal</b> classes are classes that aren't themselves persistable, and have no knowledge of persistence either.
+ These classes are totally unchanged in JDO, and require no JDO Meta-Data whatsoever.</li>
+ </ul>
+
+ <div class="section"><h3>PersistenceCapable<a name="PersistenceCapable"></a></h3>
+ <p>
+ Classes are defined as <b>PersistenceCapable</b> either by XML MetaData, like this
+ </p>
+ <div class="source"><pre>
+<class name="MyClass">
+ ...
+</class></pre></div>
+ <p>
+ or, in JDO2.1, using Annotations. Like this
+ </p>
+ <div class="source"><pre>
+@PersistenceCapable
+public class MyClass
+{
+ ...
+}</pre></div>
+ <br />
+ </div>
+
+ <div class="section"><h3>PersistenceAware<a name="PersistenceAware"></a></h3>
+ <p>
+ Classes are defined as <b>PersistenceAware</b> either by XML MetaData, like this
+ </p>
+ <div class="source"><pre>
+<class name="MyClass" persistence-modifier="persistence-aware"/></pre></div>
+ <p>
+ or, in JDO2.1, using Annotations. Like this
+ </p>
+ <div class="source"><pre>
+@PersistenceAware
+public class MyClass
+{
+ ...
+}</pre></div>
+ <br />
+ </div>
+ </div>
+
+
</div>
</div>
@@ -275,7 +275,7 @@ public class MyClass
</div>
<div id="footer">
<div class="xright">
- Copyright © 2005-2013.
+ Copyright © 2005-2014.
All Rights Reserved.
</div>
Modified: websites/production/db/content/jdo/dependencies.html
==============================================================================
--- websites/production/db/content/jdo/dependencies.html (original)
+++ websites/production/db/content/jdo/dependencies.html Sun Jan 5 10:08:45 2014
@@ -1,5 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.3 at Nov 4, 2013 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.3 at Jan 5, 2014 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -12,7 +12,7 @@
</style>
<link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
<meta name="author" content="JDO Documentation Team" />
- <meta name="Date-Revision-yyyymmdd" content="20131104" />
+ <meta name="Date-Revision-yyyymmdd" content="20140105" />
<meta http-equiv="Content-Language" content="en" />
</head>
@@ -102,7 +102,7 @@
<li class="none">
<a href="field_types.html" title="Types of Fields">Types of Fields</a>
</li>
- <li class="collapsed">
+ <li class="collapsed">
<a href="metadata.html" title="MetaData">MetaData</a>
</li>
<li class="none">
@@ -210,80 +210,80 @@
</div>
<div id="bodyColumn">
<div id="contentBox">
- <!-- Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements. See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License. -->
-
- <div class="section"><h2>The Apache JDO Project<a name="The_Apache_JDO_Project"></a></h2>
-
- <p>
- Apache JDO is a sub-project of the Apache DB TLP. It includes two major areas:
- </p>
- <ul>
- <li>
-JDO 1, Java Specification Request 12, API, Reference Implementation, and
-Technology Compatibility Kit.
- </li>
- <li>
-JDO 2, Java Specification Request 243, API, and Technology Compatibility Kit.
-The Reference Implementation is being developed in parallel by <a class="externalLink" href="http://www.jpox.org">JPOX</a>.
- </li>
- </ul>
-
- <p>
- The common external dependencies of JDO include the tools used to build and test it:
- </p>
-
- <ul>
- <li>Subversion</li>
- <li>Maven</li>
- <li>Ant</li>
- <li>JUnit</li>
- </ul>
-
- <p>
- Other external dependencies of JDO are subproject-specific:
- </p>
-
- <ul>
- <li>JDO 2.0 API
- <ul>
- <li>Java Transaction API</li>
- </ul>
- </li>
- <li>JDO 2.0 TCK
- <ul>
- <li>Java Transaction API</li>
- <li>Jakarta Commons Logging</li>
- <li>Log4j</li>
- <li>Apache Derby</li>
- <li>Spring Framework Core</li>
- <li>JPOX
- <ul>
- <li>ASM</li>
- <li>Source Forge c3p0</li>
- <li>Commons DBCP</li>
- <li>Commons Pool</li>
- <li>Commons Collections</li>
- </ul>
- </li>
- </ul>
- </li>
- </ul>
-</div>
-
-
+ <!-- Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
+ <div class="section"><h2>The Apache JDO Project<a name="The_Apache_JDO_Project"></a></h2>
+
+ <p>
+ Apache JDO is a sub-project of the Apache DB TLP. It includes two major areas:
+ </p>
+ <ul>
+ <li>
+JDO 1, Java Specification Request 12, API, Reference Implementation, and
+Technology Compatibility Kit.
+ </li>
+ <li>
+JDO 2, Java Specification Request 243, API, and Technology Compatibility Kit.
+The Reference Implementation is being developed in parallel by <a class="externalLink" href="http://www.jpox.org">JPOX</a>.
+ </li>
+ </ul>
+
+ <p>
+ The common external dependencies of JDO include the tools used to build and test it:
+ </p>
+
+ <ul>
+ <li>Subversion</li>
+ <li>Maven</li>
+ <li>Ant</li>
+ <li>JUnit</li>
+ </ul>
+
+ <p>
+ Other external dependencies of JDO are subproject-specific:
+ </p>
+
+ <ul>
+ <li>JDO 2.0 API
+ <ul>
+ <li>Java Transaction API</li>
+ </ul>
+ </li>
+ <li>JDO 2.0 TCK
+ <ul>
+ <li>Java Transaction API</li>
+ <li>Jakarta Commons Logging</li>
+ <li>Log4j</li>
+ <li>Apache Derby</li>
+ <li>Spring Framework Core</li>
+ <li>JPOX
+ <ul>
+ <li>ASM</li>
+ <li>Source Forge c3p0</li>
+ <li>Commons DBCP</li>
+ <li>Commons Pool</li>
+ <li>Commons Collections</li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ </ul>
+</div>
+
+
</div>
</div>
@@ -292,7 +292,7 @@ The Reference Implementation is being de
</div>
<div id="footer">
<div class="xright">
- Copyright © 2005-2013.
+ Copyright © 2005-2014.
All Rights Reserved.
</div>
Modified: websites/production/db/content/jdo/downloads.html
==============================================================================
--- websites/production/db/content/jdo/downloads.html (original)
+++ websites/production/db/content/jdo/downloads.html Sun Jan 5 10:08:45 2014
@@ -1,5 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.3 at Nov 4, 2013 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.3 at Jan 5, 2014 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -12,7 +12,7 @@
</style>
<link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
<meta name="author" content="JDO Documentation Team" />
- <meta name="Date-Revision-yyyymmdd" content="20131104" />
+ <meta name="Date-Revision-yyyymmdd" content="20140105" />
<meta http-equiv="Content-Language" content="en" />
</head>
@@ -102,7 +102,7 @@
<li class="none">
<a href="field_types.html" title="Types of Fields">Types of Fields</a>
</li>
- <li class="collapsed">
+ <li class="collapsed">
<a href="metadata.html" title="MetaData">MetaData</a>
</li>
<li class="none">
@@ -210,116 +210,116 @@
</div>
<div id="bodyColumn">
<div id="contentBox">
- <!-- Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements. See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License. -->
-
- <div class="section"><h2>Latest Official Release<a name="Latest_Official_Release"></a></h2>
- <p>
- <a href="releases/release-3.1-rc1.cgi">JDO 3.1-rc1</a>
- <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
- September 22, 2013
- </p>
- </div>
-
- <div class="section"><h2>Previous Official Releases<a name="Previous_Official_Releases"></a></h2>
- <p>
- <a href="releases/release-3.0.1.cgi">JDO 3.0.1</a>
- <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
- November 13, 2011
- </p>
- <p>
- <a href="releases/release-3.0.cgi">JDO 3.0</a>
- <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
- July 23, 2010
- </p>
- <p>
- <a href="releases/release-2.2.cgi">JDO 2.2</a>
- <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
- October 24, 2008
- </p>
- <p>
- <a href="releases/release-2.1.1.cgi">JDO 2.1.1</a>
- <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
- August 29, 2008
- </p>
- <p>
- <a href="releases/release-2.1.cgi">JDO 2.1</a>
- <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
- March 17, 2008
- </p>
- <p>
- <a href="releases/release-2.0.cgi">JDO 2.0</a>
- <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
- May 1, 2006
- </p>
-<!-- <p>
-<a href="releases/release-2.0-rc1.cgi">JDO 2.0 rc1</a>
-<img vspace="0" hspace="8" SRC="images/dot_clear.gif"/>
-Feb 27, 2006
-</p>
-<p>
-<a href="releases/release-2.0-beta.cgi">JDO 2.0 beta</a>
-<img vspace="0" hspace="8" SRC="images/dot_clear.gif"/>
-Jan 24, 2006
- </p> -->
-</div>
-
- <div class="section"><h2>About JDO Releases<a name="About_JDO_Releases"></a></h2>
- <p>
- A release of JDO includes the JDO API and the
- Technology Compatibility Kit (TCK).
- The TCK is available only in source form. The API
- project is available as source and binary, and as raw jar files.
- </p>
- <ul>
- <li>
- The api project contains source to build jdo-api.jar.
- The jar file is the only artifact needed for users who wish to compile
- their programs using the JDO API.
- It can be downloaded automatically by maven and placed into the local
- maven repository if you include the
- proper dependency in your maven project definition.
- Use groupId javax.jdo, artifactId jdo-api, version 3.0,
- and define your remote repository as
- http://www.ibiblio.org/maven.
- Alternatively, it can be downloaded manually and put into a location
- of your choice.
- </li>
- <li>
- The tck project contains the JDO Technology Compatibility Kit.
- The source distribution is the only artifact needed to be downloaded
- by the user.
- </li>
- </ul>
- <p>
- All are available for download as source, but if you wish
- to run the TCK you need only download the TCK project.
- The dependencies will be automatically downloaded by maven
- as jar files.
- </p>
- <p>
- For information on running the TCK, see <a href="tck.html">TCK</a>.
- If downloading multiple source packages, extract them all
- into the same directory. This will preserve the source
- dependencies among the projects.
- </p>
- <p>
- See <a href="svn.html">Source Code Version Control</a> for information about downloading the latest source code for all of the JDO projects.
- </p>
- </div>
-
+ <!-- Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
+ <div class="section"><h2>Latest Official Release<a name="Latest_Official_Release"></a></h2>
+ <p>
+ <a href="releases/release-3.1-rc1.cgi">JDO 3.1-rc1</a>
+ <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
+ September 22, 2013
+ </p>
+ </div>
+
+ <div class="section"><h2>Previous Official Releases<a name="Previous_Official_Releases"></a></h2>
+ <p>
+ <a href="releases/release-3.0.1.cgi">JDO 3.0.1</a>
+ <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
+ November 13, 2011
+ </p>
+ <p>
+ <a href="releases/release-3.0.cgi">JDO 3.0</a>
+ <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
+ July 23, 2010
+ </p>
+ <p>
+ <a href="releases/release-2.2.cgi">JDO 2.2</a>
+ <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
+ October 24, 2008
+ </p>
+ <p>
+ <a href="releases/release-2.1.1.cgi">JDO 2.1.1</a>
+ <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
+ August 29, 2008
+ </p>
+ <p>
+ <a href="releases/release-2.1.cgi">JDO 2.1</a>
+ <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
+ March 17, 2008
+ </p>
+ <p>
+ <a href="releases/release-2.0.cgi">JDO 2.0</a>
+ <img src="images/dot_clear.gif" vspace="0" hspace="8" alt="" />
+ May 1, 2006
+ </p>
+<!-- <p>
+<a href="releases/release-2.0-rc1.cgi">JDO 2.0 rc1</a>
+<img vspace="0" hspace="8" SRC="images/dot_clear.gif"/>
+Feb 27, 2006
+</p>
+<p>
+<a href="releases/release-2.0-beta.cgi">JDO 2.0 beta</a>
+<img vspace="0" hspace="8" SRC="images/dot_clear.gif"/>
+Jan 24, 2006
+ </p> -->
+</div>
+
+ <div class="section"><h2>About JDO Releases<a name="About_JDO_Releases"></a></h2>
+ <p>
+ A release of JDO includes the JDO API and the
+ Technology Compatibility Kit (TCK).
+ The TCK is available only in source form. The API
+ project is available as source and binary, and as raw jar files.
+ </p>
+ <ul>
+ <li>
+ The api project contains source to build jdo-api.jar.
+ The jar file is the only artifact needed for users who wish to compile
+ their programs using the JDO API.
+ It can be downloaded automatically by maven and placed into the local
+ maven repository if you include the
+ proper dependency in your maven project definition.
+ Use groupId javax.jdo, artifactId jdo-api, version 3.0,
+ and define your remote repository as
+ http://www.ibiblio.org/maven.
+ Alternatively, it can be downloaded manually and put into a location
+ of your choice.
+ </li>
+ <li>
+ The tck project contains the JDO Technology Compatibility Kit.
+ The source distribution is the only artifact needed to be downloaded
+ by the user.
+ </li>
+ </ul>
+ <p>
+ All are available for download as source, but if you wish
+ to run the TCK you need only download the TCK project.
+ The dependencies will be automatically downloaded by maven
+ as jar files.
+ </p>
+ <p>
+ For information on running the TCK, see <a href="tck.html">TCK</a>.
+ If downloading multiple source packages, extract them all
+ into the same directory. This will preserve the source
+ dependencies among the projects.
+ </p>
+ <p>
+ See <a href="svn.html">Source Code Version Control</a> for information about downloading the latest source code for all of the JDO projects.
+ </p>
+ </div>
+
</div>
</div>
@@ -328,7 +328,7 @@ Jan 24, 2006
</div>
<div id="footer">
<div class="xright">
- Copyright © 2005-2013.
+ Copyright © 2005-2014.
All Rights Reserved.
</div>
Modified: websites/production/db/content/jdo/enhancement.html
==============================================================================
--- websites/production/db/content/jdo/enhancement.html (original)
+++ websites/production/db/content/jdo/enhancement.html Sun Jan 5 10:08:45 2014
@@ -1,5 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.3 at Nov 4, 2013 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.3 at Jan 5, 2014 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -11,7 +11,7 @@
@import url("./css/site.css");
</style>
<link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
- <meta name="Date-Revision-yyyymmdd" content="20131104" />
+ <meta name="Date-Revision-yyyymmdd" content="20140105" />
<meta http-equiv="Content-Language" content="en" />
</head>
@@ -101,7 +101,7 @@
<li class="none">
<a href="field_types.html" title="Types of Fields">Types of Fields</a>
</li>
- <li class="collapsed">
+ <li class="collapsed">
<a href="metadata.html" title="MetaData">MetaData</a>
</li>
<li class="none">
@@ -209,558 +209,558 @@
</div>
<div id="bodyColumn">
<div id="contentBox">
-
-
- <div class="section"><h2>JDO Enhancement<a name="JDO_Enhancement"></a></h2>
- <p>
- JDO defines a byte-code enhancement process that provides for dirty detection of fields.
- Before a class is used at runtime it is compiled and then "enhanced" to implement the interface
- <i>PersistenceCapable</i>, and optionally also <i>Detachable</i>.
- </p>
- <p>
- We can demonstrate this by taking a sample class, and seeing it before and after enhancement.
- We start with the following class
- </p>
- <div class="source"><pre>
-package org.apache.jdo.test;
-
-public class A
-{
- long id;
- String name;
- B b;
-
- public A(String name)
- {
- this.name = name;
- }
-
- public void setId(long id)
- {
- this.id = id;
- }
-
- public void setB(B b)
- {
- this.b = b;
- }
-
- public String getName()
- {
- return name;
- }
-
- public B getB()
- {
- return b;
- }
-
- public long getId()
- {
- return id;
- }
-
- public String toString()
- {
- return "A : id=" + id + " [" + name + "] b=\"" + b + "\"";
- }
-}</pre></div>
- <p>
- and require it to be <i>PersistenceCapable</i> and <i>Detachable</i>.
- The enhancement process needs to intercept all updates of the fields of the class (id, name, b) as well
- as add on the necessary <i>PersistenceCapable</i>, <i>Detachable</i> methods.
- After "enhancement" it becomes
- </p>
- <div class="source"><pre>
-package org.apache.jdo.test;
-import java.util.BitSet;
-
-import javax.jdo.JDODetachedFieldAccessException;
-import javax.jdo.JDOFatalInternalException;
-import javax.jdo.PersistenceManager;
-import javax.jdo.identity.LongIdentity;
-import javax.jdo.spi.Detachable;
-import javax.jdo.spi.JDOImplHelper;
-import javax.jdo.spi.JDOPermission;
-import javax.jdo.spi.PersistenceCapable;
-import javax.jdo.spi.StateManager;
-
-public class A implements PersistenceCapable, Detachable
-{
- long id;
- String name;
- B b;
- protected transient StateManager jdoStateManager;
- protected transient byte jdoFlags;
- protected Object[] jdoDetachedState;
- private static final byte[] jdoFieldFlags;
- private static final Class jdoPersistenceCapableSuperclass;
- private static final Class[] jdoFieldTypes;
- private static final String[] jdoFieldNames = __jdoFieldNamesInit();
- private static final int jdoInheritedFieldCount;
-
- static
- {
- jdoFieldTypes = __jdoFieldTypesInit();
- jdoFieldFlags = __jdoFieldFlagsInit();
- jdoInheritedFieldCount = __jdoGetInheritedFieldCount();
- jdoPersistenceCapableSuperclass = __jdoPersistenceCapableSuperclassInit();
- JDOImplHelper.registerClass(___jdo$loadClass("org.apache.jdo.test.A"),
- jdoFieldNames, jdoFieldTypes,
- jdoFieldFlags,
- jdoPersistenceCapableSuperclass, new A());
- }
-
- public void setId(long id)
- {
- jdoSetid(this, id);
- }
-
- public void setB(B b)
- {
- jdoSetb(this, b);
- }
-
- public String getName()
- {
- return jdoGetname(this);
- }
-
- public B getB()
- {
- return jdoGetb(this);
- }
-
- public long getId()
- {
- return jdoGetid(this);
- }
-
- public String toString()
- {
- return new StringBuilder().append("A : id=").append(jdoGetid(this))
- .append(" [").append(jdoGetname(this))
- .append("] b=\"").append(jdoGetb(this))
- .append("\"").toString();
- }
-
- public void jdoCopyKeyFieldsFromObjectId(PersistenceCapable.ObjectIdFieldConsumer fc, Object oid)
- {
- if (fc == null)
- throw new IllegalArgumentException
- ("ObjectIdFieldConsumer is null");
- if (!(oid instanceof LongIdentity))
- throw new ClassCastException
- ("oid is not instanceof javax.jdo.identity.LongIdentity");
- LongIdentity o = (LongIdentity) oid;
- fc.storeLongField(1, o.getKey());
- }
-
- protected void jdoCopyKeyFieldsFromObjectId(Object oid)
- {
- if (!(oid instanceof LongIdentity))
- throw new ClassCastException
- ("key class is not javax.jdo.identity.LongIdentity or null");
- LongIdentity o = (LongIdentity) oid;
- id = o.getKey();
- }
-
- public final void jdoCopyKeyFieldsToObjectId(Object oid)
- {
- throw new JDOFatalInternalException
- ("It's illegal to call jdoCopyKeyFieldsToObjectId for a class with Single Field Identity.");
- }
-
- public final void jdoCopyKeyFieldsToObjectId
- (PersistenceCapable.ObjectIdFieldSupplier fs, Object oid) {
- throw new JDOFatalInternalException
- ("It's illegal to call jdoCopyKeyFieldsToObjectId for a class with Single Field Identity.");
- }
-
- public final Object jdoGetObjectId()
- {
- if (jdoStateManager != null)
- return jdoStateManager.getObjectId(this);
- if (this.jdoIsDetached() != true)
- return null;
- return jdoDetachedState[0];
- }
-
- public final Object jdoGetVersion()
- {
- if (jdoStateManager != null)
- return jdoStateManager.getVersion(this);
- if (this.jdoIsDetached() != true)
- return null;
- return jdoDetachedState[1];
- }
-
- protected final void jdoPreSerialize()
- {
- if (jdoStateManager != null)
- jdoStateManager.preSerialize(this);
- }
-
- public final PersistenceManager jdoGetPersistenceManager()
- {
- return (jdoStateManager != null
- ? jdoStateManager.getPersistenceManager(this) : null);
- }
-
- public final Object jdoGetTransactionalObjectId()
- {
- return (jdoStateManager != null
- ? jdoStateManager.getTransactionalObjectId(this) : null);
- }
-
- public final boolean jdoIsDeleted()
- {
- return (jdoStateManager != null ? jdoStateManager.isDeleted(this): false);
- }
-
- public final boolean jdoIsDirty()
- {
- if (jdoStateManager != null)
- return jdoStateManager.isDirty(this);
- if (this.jdoIsDetached() != true)
- return false;
- if (((BitSet) jdoDetachedState[3]).length() <= 0)
- return false;
- return true;
- }
-
- public final boolean jdoIsNew()
- {
- return jdoStateManager != null ? jdoStateManager.isNew(this) : false;
- }
-
- public final boolean jdoIsPersistent()
- {
- return (jdoStateManager != null ? jdoStateManager.isPersistent(this): false);
- }
-
- public final boolean jdoIsTransactional()
- {
- return (jdoStateManager != null ? jdoStateManager.isTransactional(this): false);
- }
-
- public final boolean jdoIsDetached()
- {
- if (jdoStateManager == null) {
- if (jdoDetachedState == null)
- return false;
- return true;
- }
- return false;
- }
-
- public final void jdoMakeDirty(String fieldName)
- {
- if (jdoStateManager != null)
- jdoStateManager.makeDirty(this, fieldName);
- }
-
- public final Object jdoNewObjectIdInstance()
- {
- return new LongIdentity(getClass(), id);
- }
-
- public final Object jdoNewObjectIdInstance(Object key)
- {
- if (key == null)
- throw new IllegalArgumentException("key is null");
- if (key instanceof String != true)
- return new LongIdentity(this.getClass(), (Long) key);
- return new LongIdentity(this.getClass(), (String) key);
- }
-
- public final void jdoProvideFields(int[] fieldId)
- {
- if (fieldId == null)
- throw new IllegalArgumentException("argment is null");
- int i = fieldId.length - 1;
- if (i >= 0)
- {
- do
- jdoProvideField(fieldId[i]);
- while (--i >= 0);
- }
- }
-
- public final void jdoReplaceFields(int[] fieldId)
- {
- if (fieldId == null)
- throw new IllegalArgumentException("argument is null");
- int i = fieldId.length;
- if (i > 0)
- {
- int i_0_ = 0;
- do
- jdoReplaceField(fieldId[i_0_]);
- while (++i_0_ < i);
- }
- }
-
- public final void jdoReplaceFlags()
- {
- if (jdoStateManager != null)
- {
- A a = this;
- a.jdoFlags = a.jdoStateManager.replacingFlags(this);
- }
- }
-
- public final synchronized void jdoReplaceStateManager(StateManager stateManager)
- {
- if (jdoStateManager != null)
- {
- A a = this;
- a.jdoStateManager = a.jdoStateManager.replacingStateManager(this, stateManager);
- }
- else
- {
- JDOImplHelper.checkAuthorizedStateManager(sm);
- jdoStateManager = stateManager;
- jdoFlags = (byte) 1;
- }
- }
-
- public final synchronized void jdoReplaceDetachedState()
- {
- if (jdoStateManager == null)
- throw new IllegalStateException("state manager is null");
- A a = this;
- a.jdoDetachedState = a.jdoStateManager.replacingDetachedState(this, jdoDetachedState);
- }
-
- public PersistenceCapable jdoNewInstance(StateManager sm)
- {
- A result = new A();
- A a = result;
- a.jdoFlags = (byte) 1;
- a.jdoStateManager = sm;
- return a;
- }
-
- public PersistenceCapable jdoNewInstance(StateManager sm, Object o)
- {
- A result = new A();
- A a = result;
- a.jdoFlags = (byte) 1;
- a.jdoStateManager = sm;
- result.jdoCopyKeyFieldsFromObjectId(o);
- return a;
- }
-
- public void jdoReplaceField(int fieldIndex)
- {
- if (jdoStateManager == null)
- throw new IllegalStateException("state manager is null");
- switch (fieldIndex)
- {
- case 0:
- {
- A a = this;
- a.b = (B) a.jdoStateManager.replacingObjectField(this, fieldIndex);
- break;
- }
- case 1:
- {
- A a = this;
- a.id = a.jdoStateManager.replacingLongField(this, fieldIndex);
- break;
- }
- case 2:
- {
- A a = this;
- a.name = a.jdoStateManager.replacingStringField(this, fieldIndex);
- break;
- }
- default:
- throw new IllegalArgumentException("out of field index :" + fieldIndex);
- }
- }
-
- public void jdoProvideField(int fieldIndex)
- {
- if (jdoStateManager == null)
- throw new IllegalStateException("state manager is null");
- switch (fieldIndex)
- {
- case 0:
- jdoStateManager.providedObjectField(this, fieldIndex, b);
- break;
- case 1:
- jdoStateManager.providedLongField(this, fieldIndex, id);
- break;
- case 2:
- jdoStateManager.providedStringField(this, fieldIndex, name);
- break;
- default:
- throw new IllegalArgumentException("out of field index :" + fieldIndex);
- }
- }
-
- protected final void jdoCopyField(A obj, int index)
- {
- switch (index)
- {
- case 0:
- b = obj.b;
- break;
- case 1:
- id = obj.id;
- break;
- case 2:
- name = obj.name;
- break;
- default:
- throw new IllegalArgumentException("out of field index :" + index);
- }
- }
-
- public void jdoCopyFields(Object obj, int[] fieldNumbers)
- {
- if (jdoStateManager == null)
- throw new IllegalStateException("state manager is null");
- if (fieldNumbers == null)
- throw new IllegalStateException("fieldNumbers is null");
- if (obj instanceof A != true)
- throw new IllegalArgumentException("object is not org.apache.jdo.test.A");
- A me = (A) obj;
- if (jdoStateManager != me.jdoStateManager)
- throw new IllegalArgumentException("state manager unmatch");
- int i = fieldNumbers.length - 1;
- if (i >= 0)
- {
- do
- jdoCopyField(me, fieldNumbers[i]);
- while (--i >= 0);
- }
- }
-
- private static final String[] __jdoFieldNamesInit()
- {
- return new String[] { "b", "id", "name" };
- }
-
- private static final Class[] __jdoFieldTypesInit()
- {
- return new Class[] { ___jdo$loadClass("org.apache.jdo.test.B"), Long.TYPE,
- ___jdo$loadClass("java.lang.String") };
- }
-
- private static final byte[] __jdoFieldFlagsInit()
- {
- return new byte[] { 10, 24, 21 };
- }
-
- protected static int __jdoGetInheritedFieldCount()
- {
- return 0;
- }
-
- protected static int jdoGetManagedFieldCount()
- {
- return 3;
- }
-
- private static Class __jdoPersistenceCapableSuperclassInit()
- {
- return null;
- }
-
- public static Class ___jdo$loadClass(String className)
- {
- try
- {
- return Class.forName(className);
- }
- catch (ClassNotFoundException e)
- {
- throw new NoClassDefFoundError(e.getMessage());
- }
- }
-
- private Object jdoSuperClone()
- throws CloneNotSupportedException
- {
- A o = (A) super.clone();
- o.jdoFlags = (byte) 0;
- o.jdoStateManager = null;
- return o;
- }
-
- public A()
- {
- /* empty */
- }
-
- static void jdoSetb(A objPC, B b_m)
- {
- if (objPC.jdoStateManager == null)
- objPC.b = b_m;
- else
- objPC.jdoStateManager.setObjectField(objPC, 0, objPC.b, b_m);
- if (objPC.jdoIsDetached() == true)
- ((BitSet) objPC.jdoDetachedState[3]).set(0);
- }
-
- static B jdoGetb(A objPC)
- {
- if (objPC.jdoStateManager != null
- && !objPC.jdoStateManager.isLoaded(objPC, 0))
- return (B) objPC.jdoStateManager.getObjectField(objPC, 0, objPC.b);
- if (objPC.jdoIsDetached() != false
- && ((BitSet) objPC.jdoDetachedState[2]).get(0) != true
- && ((BitSet) objPC.jdoDetachedState[3]).get(0) != true)
- throw new JDODetachedFieldAccessException
- ("You have just attempted to access field \"b\" yet this field was not detached when you detached the object. " +
- "Either dont access this field, or detach the field when detaching the object.");
- return objPC.b;
- }
-
- static void jdoSetid(A objPC, long id_n)
- {
- objPC.id = id_n;
- }
-
- static long jdoGetid(A objPC)
- {
- return objPC.id;
- }
-
- static void jdoSetname(A objPC, String name_c)
- {
- if (objPC.jdoFlags != 0 && objPC.jdoStateManager != null)
- objPC.jdoStateManager.setStringField(objPC, 2, objPC.name, name_c);
- else
- {
- objPC.name = name_c;
- if (objPC.jdoIsDetached() == true)
- ((BitSet) objPC.jdoDetachedState[3]).set(2);
- }
- }
-
- static String jdoGetname(A objPC)
- {
- if (objPC.jdoFlags > 0 && objPC.jdoStateManager != null && !objPC.jdoStateManager.isLoaded(objPC, 2))
- return objPC.jdoStateManager.getStringField(objPC, 2, objPC.name);
- if (objPC.jdoIsDetached() != false && ((BitSet) objPC.jdoDetachedState[2]).get(2) != true)
- throw new JDODetachedFieldAccessException
- ("You have just attempted to access field \"name\" yet this field was not detached when you detached the object." +
- "Either dont access this field, or detach the field when detaching the object.");
- return objPC.name;
- }
-
- public A(String name)
- {
- jdoSetname(this, name);
- }
-}</pre></div>
- </div>
-
-
+
+
+ <div class="section"><h2>JDO Enhancement<a name="JDO_Enhancement"></a></h2>
+ <p>
+ JDO defines a byte-code enhancement process that provides for dirty detection of fields.
+ Before a class is used at runtime it is compiled and then "enhanced" to implement the interface
+ <i>PersistenceCapable</i>, and optionally also <i>Detachable</i>.
+ </p>
+ <p>
+ We can demonstrate this by taking a sample class, and seeing it before and after enhancement.
+ We start with the following class
+ </p>
+ <div class="source"><pre>
+package org.apache.jdo.test;
+
+public class A
+{
+ long id;
+ String name;
+ B b;
+
+ public A(String name)
+ {
+ this.name = name;
+ }
+
+ public void setId(long id)
+ {
+ this.id = id;
+ }
+
+ public void setB(B b)
+ {
+ this.b = b;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public B getB()
+ {
+ return b;
+ }
+
+ public long getId()
+ {
+ return id;
+ }
+
+ public String toString()
+ {
+ return "A : id=" + id + " [" + name + "] b=\"" + b + "\"";
+ }
+}</pre></div>
+ <p>
+ and require it to be <i>PersistenceCapable</i> and <i>Detachable</i>.
+ The enhancement process needs to intercept all updates of the fields of the class (id, name, b) as well
+ as add on the necessary <i>PersistenceCapable</i>, <i>Detachable</i> methods.
+ After "enhancement" it becomes
+ </p>
+ <div class="source"><pre>
+package org.apache.jdo.test;
+import java.util.BitSet;
+
+import javax.jdo.JDODetachedFieldAccessException;
+import javax.jdo.JDOFatalInternalException;
+import javax.jdo.PersistenceManager;
+import javax.jdo.identity.LongIdentity;
+import javax.jdo.spi.Detachable;
+import javax.jdo.spi.JDOImplHelper;
+import javax.jdo.spi.JDOPermission;
+import javax.jdo.spi.PersistenceCapable;
+import javax.jdo.spi.StateManager;
+
+public class A implements PersistenceCapable, Detachable
+{
+ long id;
+ String name;
+ B b;
+ protected transient StateManager jdoStateManager;
+ protected transient byte jdoFlags;
+ protected Object[] jdoDetachedState;
+ private static final byte[] jdoFieldFlags;
+ private static final Class jdoPersistenceCapableSuperclass;
+ private static final Class[] jdoFieldTypes;
+ private static final String[] jdoFieldNames = __jdoFieldNamesInit();
+ private static final int jdoInheritedFieldCount;
+
+ static
+ {
+ jdoFieldTypes = __jdoFieldTypesInit();
+ jdoFieldFlags = __jdoFieldFlagsInit();
+ jdoInheritedFieldCount = __jdoGetInheritedFieldCount();
+ jdoPersistenceCapableSuperclass = __jdoPersistenceCapableSuperclassInit();
+ JDOImplHelper.registerClass(___jdo$loadClass("org.apache.jdo.test.A"),
+ jdoFieldNames, jdoFieldTypes,
+ jdoFieldFlags,
+ jdoPersistenceCapableSuperclass, new A());
+ }
+
+ public void setId(long id)
+ {
+ jdoSetid(this, id);
+ }
+
+ public void setB(B b)
+ {
+ jdoSetb(this, b);
+ }
+
+ public String getName()
+ {
+ return jdoGetname(this);
+ }
+
+ public B getB()
+ {
+ return jdoGetb(this);
+ }
+
+ public long getId()
+ {
+ return jdoGetid(this);
+ }
+
+ public String toString()
+ {
+ return new StringBuilder().append("A : id=").append(jdoGetid(this))
+ .append(" [").append(jdoGetname(this))
+ .append("] b=\"").append(jdoGetb(this))
+ .append("\"").toString();
+ }
+
+ public void jdoCopyKeyFieldsFromObjectId(PersistenceCapable.ObjectIdFieldConsumer fc, Object oid)
+ {
+ if (fc == null)
+ throw new IllegalArgumentException
+ ("ObjectIdFieldConsumer is null");
+ if (!(oid instanceof LongIdentity))
+ throw new ClassCastException
+ ("oid is not instanceof javax.jdo.identity.LongIdentity");
+ LongIdentity o = (LongIdentity) oid;
+ fc.storeLongField(1, o.getKey());
+ }
+
+ protected void jdoCopyKeyFieldsFromObjectId(Object oid)
+ {
+ if (!(oid instanceof LongIdentity))
+ throw new ClassCastException
+ ("key class is not javax.jdo.identity.LongIdentity or null");
+ LongIdentity o = (LongIdentity) oid;
+ id = o.getKey();
+ }
+
+ public final void jdoCopyKeyFieldsToObjectId(Object oid)
+ {
+ throw new JDOFatalInternalException
+ ("It's illegal to call jdoCopyKeyFieldsToObjectId for a class with Single Field Identity.");
+ }
+
+ public final void jdoCopyKeyFieldsToObjectId
+ (PersistenceCapable.ObjectIdFieldSupplier fs, Object oid) {
+ throw new JDOFatalInternalException
+ ("It's illegal to call jdoCopyKeyFieldsToObjectId for a class with Single Field Identity.");
+ }
+
+ public final Object jdoGetObjectId()
+ {
+ if (jdoStateManager != null)
+ return jdoStateManager.getObjectId(this);
+ if (this.jdoIsDetached() != true)
+ return null;
+ return jdoDetachedState[0];
+ }
+
+ public final Object jdoGetVersion()
+ {
+ if (jdoStateManager != null)
+ return jdoStateManager.getVersion(this);
+ if (this.jdoIsDetached() != true)
+ return null;
+ return jdoDetachedState[1];
+ }
+
+ protected final void jdoPreSerialize()
+ {
+ if (jdoStateManager != null)
+ jdoStateManager.preSerialize(this);
+ }
+
+ public final PersistenceManager jdoGetPersistenceManager()
+ {
+ return (jdoStateManager != null
+ ? jdoStateManager.getPersistenceManager(this) : null);
+ }
+
+ public final Object jdoGetTransactionalObjectId()
+ {
+ return (jdoStateManager != null
+ ? jdoStateManager.getTransactionalObjectId(this) : null);
+ }
+
+ public final boolean jdoIsDeleted()
+ {
+ return (jdoStateManager != null ? jdoStateManager.isDeleted(this): false);
+ }
+
+ public final boolean jdoIsDirty()
+ {
+ if (jdoStateManager != null)
+ return jdoStateManager.isDirty(this);
+ if (this.jdoIsDetached() != true)
+ return false;
+ if (((BitSet) jdoDetachedState[3]).length() <= 0)
+ return false;
+ return true;
+ }
+
+ public final boolean jdoIsNew()
+ {
+ return jdoStateManager != null ? jdoStateManager.isNew(this) : false;
+ }
+
+ public final boolean jdoIsPersistent()
+ {
+ return (jdoStateManager != null ? jdoStateManager.isPersistent(this): false);
+ }
+
+ public final boolean jdoIsTransactional()
+ {
+ return (jdoStateManager != null ? jdoStateManager.isTransactional(this): false);
+ }
+
+ public final boolean jdoIsDetached()
+ {
+ if (jdoStateManager == null) {
+ if (jdoDetachedState == null)
+ return false;
+ return true;
+ }
+ return false;
+ }
+
+ public final void jdoMakeDirty(String fieldName)
+ {
+ if (jdoStateManager != null)
+ jdoStateManager.makeDirty(this, fieldName);
+ }
+
+ public final Object jdoNewObjectIdInstance()
+ {
+ return new LongIdentity(getClass(), id);
+ }
+
+ public final Object jdoNewObjectIdInstance(Object key)
+ {
+ if (key == null)
+ throw new IllegalArgumentException("key is null");
+ if (key instanceof String != true)
+ return new LongIdentity(this.getClass(), (Long) key);
+ return new LongIdentity(this.getClass(), (String) key);
+ }
+
+ public final void jdoProvideFields(int[] fieldId)
+ {
+ if (fieldId == null)
+ throw new IllegalArgumentException("argment is null");
+ int i = fieldId.length - 1;
+ if (i >= 0)
+ {
+ do
+ jdoProvideField(fieldId[i]);
+ while (--i >= 0);
+ }
+ }
+
+ public final void jdoReplaceFields(int[] fieldId)
+ {
+ if (fieldId == null)
+ throw new IllegalArgumentException("argument is null");
+ int i = fieldId.length;
+ if (i > 0)
+ {
+ int i_0_ = 0;
+ do
+ jdoReplaceField(fieldId[i_0_]);
+ while (++i_0_ < i);
+ }
+ }
+
+ public final void jdoReplaceFlags()
+ {
+ if (jdoStateManager != null)
+ {
+ A a = this;
+ a.jdoFlags = a.jdoStateManager.replacingFlags(this);
+ }
+ }
+
+ public final synchronized void jdoReplaceStateManager(StateManager stateManager)
+ {
+ if (jdoStateManager != null)
+ {
+ A a = this;
+ a.jdoStateManager = a.jdoStateManager.replacingStateManager(this, stateManager);
+ }
+ else
+ {
+ JDOImplHelper.checkAuthorizedStateManager(sm);
+ jdoStateManager = stateManager;
+ jdoFlags = (byte) 1;
+ }
+ }
+
+ public final synchronized void jdoReplaceDetachedState()
+ {
+ if (jdoStateManager == null)
+ throw new IllegalStateException("state manager is null");
+ A a = this;
+ a.jdoDetachedState = a.jdoStateManager.replacingDetachedState(this, jdoDetachedState);
+ }
+
+ public PersistenceCapable jdoNewInstance(StateManager sm)
+ {
+ A result = new A();
+ A a = result;
+ a.jdoFlags = (byte) 1;
+ a.jdoStateManager = sm;
+ return a;
+ }
+
+ public PersistenceCapable jdoNewInstance(StateManager sm, Object o)
+ {
+ A result = new A();
+ A a = result;
+ a.jdoFlags = (byte) 1;
+ a.jdoStateManager = sm;
+ result.jdoCopyKeyFieldsFromObjectId(o);
+ return a;
+ }
+
+ public void jdoReplaceField(int fieldIndex)
+ {
+ if (jdoStateManager == null)
+ throw new IllegalStateException("state manager is null");
+ switch (fieldIndex)
+ {
+ case 0:
+ {
+ A a = this;
+ a.b = (B) a.jdoStateManager.replacingObjectField(this, fieldIndex);
+ break;
+ }
+ case 1:
+ {
+ A a = this;
+ a.id = a.jdoStateManager.replacingLongField(this, fieldIndex);
+ break;
+ }
+ case 2:
+ {
+ A a = this;
+ a.name = a.jdoStateManager.replacingStringField(this, fieldIndex);
+ break;
+ }
+ default:
+ throw new IllegalArgumentException("out of field index :" + fieldIndex);
+ }
+ }
+
+ public void jdoProvideField(int fieldIndex)
+ {
+ if (jdoStateManager == null)
+ throw new IllegalStateException("state manager is null");
+ switch (fieldIndex)
+ {
+ case 0:
+ jdoStateManager.providedObjectField(this, fieldIndex, b);
+ break;
+ case 1:
+ jdoStateManager.providedLongField(this, fieldIndex, id);
+ break;
+ case 2:
+ jdoStateManager.providedStringField(this, fieldIndex, name);
+ break;
+ default:
+ throw new IllegalArgumentException("out of field index :" + fieldIndex);
+ }
+ }
+
+ protected final void jdoCopyField(A obj, int index)
+ {
+ switch (index)
+ {
+ case 0:
+ b = obj.b;
+ break;
+ case 1:
+ id = obj.id;
+ break;
+ case 2:
+ name = obj.name;
+ break;
+ default:
+ throw new IllegalArgumentException("out of field index :" + index);
+ }
+ }
+
+ public void jdoCopyFields(Object obj, int[] fieldNumbers)
+ {
+ if (jdoStateManager == null)
+ throw new IllegalStateException("state manager is null");
+ if (fieldNumbers == null)
+ throw new IllegalStateException("fieldNumbers is null");
+ if (obj instanceof A != true)
+ throw new IllegalArgumentException("object is not org.apache.jdo.test.A");
+ A me = (A) obj;
+ if (jdoStateManager != me.jdoStateManager)
+ throw new IllegalArgumentException("state manager unmatch");
+ int i = fieldNumbers.length - 1;
+ if (i >= 0)
+ {
+ do
+ jdoCopyField(me, fieldNumbers[i]);
+ while (--i >= 0);
+ }
+ }
+
+ private static final String[] __jdoFieldNamesInit()
+ {
+ return new String[] { "b", "id", "name" };
+ }
+
+ private static final Class[] __jdoFieldTypesInit()
+ {
+ return new Class[] { ___jdo$loadClass("org.apache.jdo.test.B"), Long.TYPE,
+ ___jdo$loadClass("java.lang.String") };
+ }
+
+ private static final byte[] __jdoFieldFlagsInit()
+ {
+ return new byte[] { 10, 24, 21 };
+ }
+
+ protected static int __jdoGetInheritedFieldCount()
+ {
+ return 0;
+ }
+
+ protected static int jdoGetManagedFieldCount()
+ {
+ return 3;
+ }
+
+ private static Class __jdoPersistenceCapableSuperclassInit()
+ {
+ return null;
+ }
+
+ public static Class ___jdo$loadClass(String className)
+ {
+ try
+ {
+ return Class.forName(className);
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new NoClassDefFoundError(e.getMessage());
+ }
+ }
+
+ private Object jdoSuperClone()
+ throws CloneNotSupportedException
+ {
+ A o = (A) super.clone();
+ o.jdoFlags = (byte) 0;
+ o.jdoStateManager = null;
+ return o;
+ }
+
+ public A()
+ {
+ /* empty */
+ }
+
+ static void jdoSetb(A objPC, B b_m)
+ {
+ if (objPC.jdoStateManager == null)
+ objPC.b = b_m;
+ else
+ objPC.jdoStateManager.setObjectField(objPC, 0, objPC.b, b_m);
+ if (objPC.jdoIsDetached() == true)
+ ((BitSet) objPC.jdoDetachedState[3]).set(0);
+ }
+
+ static B jdoGetb(A objPC)
+ {
+ if (objPC.jdoStateManager != null
+ && !objPC.jdoStateManager.isLoaded(objPC, 0))
+ return (B) objPC.jdoStateManager.getObjectField(objPC, 0, objPC.b);
+ if (objPC.jdoIsDetached() != false
+ && ((BitSet) objPC.jdoDetachedState[2]).get(0) != true
+ && ((BitSet) objPC.jdoDetachedState[3]).get(0) != true)
+ throw new JDODetachedFieldAccessException
+ ("You have just attempted to access field \"b\" yet this field was not detached when you detached the object. " +
+ "Either dont access this field, or detach the field when detaching the object.");
+ return objPC.b;
+ }
+
+ static void jdoSetid(A objPC, long id_n)
+ {
+ objPC.id = id_n;
+ }
+
+ static long jdoGetid(A objPC)
+ {
+ return objPC.id;
+ }
+
+ static void jdoSetname(A objPC, String name_c)
+ {
+ if (objPC.jdoFlags != 0 && objPC.jdoStateManager != null)
+ objPC.jdoStateManager.setStringField(objPC, 2, objPC.name, name_c);
+ else
+ {
+ objPC.name = name_c;
+ if (objPC.jdoIsDetached() == true)
+ ((BitSet) objPC.jdoDetachedState[3]).set(2);
+ }
+ }
+
+ static String jdoGetname(A objPC)
+ {
+ if (objPC.jdoFlags > 0 && objPC.jdoStateManager != null && !objPC.jdoStateManager.isLoaded(objPC, 2))
+ return objPC.jdoStateManager.getStringField(objPC, 2, objPC.name);
+ if (objPC.jdoIsDetached() != false && ((BitSet) objPC.jdoDetachedState[2]).get(2) != true)
+ throw new JDODetachedFieldAccessException
+ ("You have just attempted to access field \"name\" yet this field was not detached when you detached the object." +
+ "Either dont access this field, or detach the field when detaching the object.");
+ return objPC.name;
+ }
+
+ public A(String name)
+ {
+ jdoSetname(this, name);
+ }
+}</pre></div>
+ </div>
+
+
</div>
</div>
@@ -769,7 +769,7 @@ public class A implements PersistenceCap
</div>
<div id="footer">
<div class="xright">
- Copyright © 2005-2013.
+ Copyright © 2005-2014.
All Rights Reserved.
</div>