<?xml version="1.0" encoding="UTF-8"?>
<!--
 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.   
-->
<chapter id="jpa_tutorials">
    <title>
        JPA Tutorials
    </title>
    <section id="jpa_tutorials_intro">
        <title>
            OpenJPA Tutorials
        </title>
        <para>
These tutorials provide step-by-step examples of how to use various facets of
the OpenJPA system. They assume a general knowledge of JPA and Java. For more
information on these subjects, see the following URLs:
        </para>
        <itemizedlist>
            <listitem>
                <para>
<ulink url="http://java.sun.com/">Sun's Java site</ulink>
                </para>
            </listitem>
            <listitem>
                <para>
<link linkend="jpa_overview_intro">JPA Overview Document</link>
                </para>
            </listitem>
            <listitem>
                <para>
<link linkend="jpa_resources">Links to JPA</link>
                </para>
            </listitem>
        </itemizedlist>
        <section id="jpa_tutorial_requirements">
            <title>
                Tutorial Requirements
            </title>
            <para>
These tutorials require that JDK 1.5 or greater be installed on your computer,
and that <literal>java</literal> and <literal>javac</literal> are in your
<literal>PATH</literal> when you open a command shell.
            </para>
        </section>
    </section>
    <section id="jpa_tutorial">
        <title>
            OpenJPA Tutorial
        </title>
        <para>
In this tutorial you will become familiar with the basic tools and development
processes under OpenJPA by creating a simple JPA application.
        </para>
        <section id="jpa_tutorial_chapter1">
            <title>
                The Pet Shop
            </title>
            <para>
Imagine that you have decided to create a software toolkit to be used by pet
shop operators. This toolkit must provide a number of solutions to common
problems encountered at pet shops. Industry analysts indicate that the three
most desired features are inventory maintenance, inventory growth simulation,
and behavioral analysis. Not one to question the sage advice of experts, you
choose to attack these three problems first.
            </para>
            <para>
According to the aforementioned experts, most pet shops focus on three types of
animals only: dogs, rabbits, and snakes. This ontology suggests the following
class hierarchy:
            </para>
            <para>
<screen> Animal ^ | +--------------------+ | | | Dog Rabbit Snake</screen>
            </para>
            <section id="jpa_tutorial_files">
                <title>
                    Included Files
                </title>
                <para>
We have provided an implementation of <classname>Animal</classname> and
<classname>Dog</classname> classes, plus some helper classes and files to create
the initial schema and populate the database with some sample dogs. Let's take a
closer look at these classes.
                </para>
                <itemizedlist>
                    <listitem>
                        <para>
<ulink url="../../../tutorial/persistence/AnimalMaintenance.java"><classname>
tutorial.persistence.AnimalMaintenance</classname></ulink>: Provides some
utility methods for examining and manipulating the animals stored in the
database. We will fill in method definitions in
<xref linkend="jpa_tutorial_chapter3"/>.
                        </para>
                    </listitem>
                    <listitem>
                        <para>
<ulink url="../../../tutorial/persistence/Animal.java"><classname>
tutorial.persistence.Animal</classname></ulink>: This is the superclass of all
animals that this pet store software can handle.
                        </para>
                    </listitem>
                    <listitem>
                        <para>
<ulink url="../../../tutorial/persistence/Dog.java"><classname>
tutorial.persistence.Dog</classname></ulink>: Contains data and methods
specific to dogs.
                        </para>
                    </listitem>
                    <listitem>
                        <para>
<ulink url="../../../tutorial/persistence/Rabbit.java"><classname>
tutorial.persistence.Rabbit</classname></ulink>: Contains data and methods
specific to rabbits. It will be used in <xref linkend="jpa_tutorial_chapter4"/>
.
                        </para>
                    </listitem>
                    <listitem>
                        <para>
<ulink url="../../../tutorial/persistence/Snake.java"><classname>
tutorial.persistence.Snake</classname></ulink>: Contains data and methods
specific to snakes. It will be used in <xref linkend="jpa_tutorial_chapter5"/>
.
                        </para>
                    </listitem>
                    <listitem>
                        <para>
<ulink url="../../../META-INF/persistence.xml"><filename>
../../META-INF/persistence.xml</filename></ulink>: This XML file contains
OpenJPA-specific and standard JPA configuration settings.
                        </para>
                        <para>
It is important to load all persistent entity classes at startup so that OpenJPA
can match database discriminator values to entity classes. Often this happens
automatically. Some parts of this tutorial, however, do require that all entity
classes be loaded explicitly. The JPA standard includes persistent class
listings in its XML configuration format. Add the following lines to <filename>
../../META-INF/persistence.xml</filename> between the <literal>&lt;provider&gt;
</literal> and the <literal>&lt;properties&gt;</literal> elements:
                        </para>
<programlisting>
&lt;class&gt;tutorial.persistence.Animal&lt;/class&gt;
&lt;class&gt;tutorial.persistence.Dog&lt;/class&gt;
</programlisting>
                    </listitem>
                    <listitem>
                        <para>
<ulink url="../../../tutorial/persistence/solutions"><filename>solutions
</filename></ulink>: The solutions directory contains the complete solutions to
this tutorial, including finished versions of the <filename>.java</filename>
files listed above.
                        </para>
                    </listitem>
                </itemizedlist>
            </section>
            <section id="jpa_tutorial_utilities">
                <title>
                    Important Utilities
                </title>
                <itemizedlist>
                    <listitem>
                        <para>
<command>java</command>: Runs main methods in specified Java classes.
                        </para>
                    </listitem>
                    <listitem>
                        <para>
<command>javac</command>: Compiles <filename>.java</filename> files into
<filename>.class</filename> files that can be executed by <command>java
</command>.
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                        <indexterm>
                            <primary>
                                org.apache.openjpa.enhance.PCEnhancer
                            </primary>
                        </indexterm>
<command>org.apache.openjpa.enhance.PCEnhancer</command>:
Runs the OpenJPA enhancer against the specified
classes. More information is available in <xref linkend="ref_guide_pc_enhance"/>
 of the Reference Guide.
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                        <indexterm>
                            <primary>
                                org.apache.openjpa.jdbc.meta.MappingTool
                            </primary>
                        </indexterm>
<command>org.apache.openjpa.jdbc.meta.MappingTool</command>:
A utility that can be used to create and
maintain the object-relational mappings and schema of all persistent classes in
a JDBC-compliant datastore. This functionality allows the underlying mappings
and schema to be easily kept up-to-date with the Java classes in the system. See
<xref linkend="ref_guide_mapping"/> of the Reference Guide for more
information.
                        </para>
                    </listitem>
                </itemizedlist>
            </section>
        </section>
        <section id="jpa_tutorial_chapter2">
            <title>
                Getting Started
            </title>
            <para>
Let's compile the initial classes and see them in action. To do so, we must
compile the <filename>.java</filename> files, as we would with any Java project,
and then optionally pass the resulting classes through the OpenJPA enhancer.
            </para>
            <note>
                <para>
                <indexterm>
                    <primary>
                        CLASSPATH
                    </primary>
                </indexterm>
Be sure that your <envar>CLASSPATH</envar> is set correctly. Note that your
OpenJPA install directory should be in the <envar>CLASSPATH</envar>, as the
tutorial classes are located in the <literal> tutorial/persistence</literal>
directory under your OpenJPA install directory, and are in the <literal>
tutorial.persistence</literal> package.
                </para>
            </note>
            <orderedlist>
                <listitem>
                    <para>
Make sure you are in the <filename> tutorial/persistence</filename> directory.
All examples throughout the tutorial assume that you are in this directory.
                    </para>
                </listitem>
                <listitem>
                    <para>
Examine <filename>Animal.java</filename>, <filename>Dog.java</filename>, and
<filename>SeedDatabase.java</filename>
                    </para>
                    <para>
These files are good examples of the simplicity JPA engenders. As noted earlier,
persisting an object or manipulating an object's persistent data requires almost
no JPA-specific code. For a very simple example of creating persistent objects,
please see the <literal>seed</literal> method of <filename>SeedDatabase.java
</filename>. Note the objects are created with normal Java constructors. The
files <filename>Animal.java</filename> and <filename>Dog.java</filename> are
also good examples of how JPA allows you to manipulate persistent data without
writing any specific JPA code, by providing simple annotations.
                    </para>
                    <para>
Let's take a look at the <filename>Animal.java</filename> file. Notice that the
class is a Plain Old Java Object (POJO), with several annotations describing how
the class is mapped into a relational database. First, let's examine the class
level annotations:
                    </para>
<programlisting>
@Entity(name="Animal")
@Table(name="JPA_TUT_ANIMAL")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="SPECIES", length=100)
public abstract class Animal
{
    ...
}
</programlisting>
                    <para>
The annotations serve to map the class into the database. For more information
on these and other annotations, see <xref linkend="jpa_overview_meta"/>
and <xref linkend="jpa_overview_mapping"/>.
                    </para>
                    <orderedlist>
                        <listitem>
                            <para>
<command>@Entity</command>: This annotation indicates that instances of this
class may be persistent entities. The value of the <command>name</command>
attribute is the entity name, and is used in queries, etc.
                            </para>
                        </listitem>
                        <listitem>
                            <para>
<command>@Table</command>: This annotation is used to map the entity to a
primary table. The value of the <command>name</command> attribute specifies the
name of the relational table to use as the primary table.
                            </para>
                        </listitem>
                        <listitem>
                            <para>
<command>@Inheritance</command>: When multiple classes in an inheritance
hierarchy are persistent entity types, it is important to describe how the
inheritance hierarchy is mapped. Setting the value of the <command>strategy
</command> attribute to <command>InheritanceType.SINGLE_TABLE</command>
indicates that the primary table for all subclasses shall be the same table as
for the superclass.
                            </para>
                        </listitem>
                        <listitem>
                            <para>
<command>@DiscriminatorColumn</command>: With a <command>SINGLE_TABLE</command>
inheritance mapping strategy, instances of multiple classes will be stored in
the same table. This annotation describes a column in that table that is used to
determine the type of an instance whose data is stored in a particular row. The
<command>name</command> attribute is the name of the column, and the <command>
length</command> attribute indicates the size of the column. By default, the
unqualified class name for the instance is stored in the discriminator column.
To store a different value for a type, use the <command>@DiscriminatorValue
</command> annotation.
                            </para>
                        </listitem>
                    </orderedlist>
                    <para>
Let's take a look at our class' field annotations. We have chosen to use
<emphasis>field access</emphasis> for our entities, meaning the persistence
implementation will get and set persistent state directly through our class'
declared fields. We could have chosen to use <emphasis> property access
</emphasis>, in which the implementation accesses persistent state through our
JavaBean getter and setter methods. In that case, we would have annotated our
getter methods rather than our fields.
                    </para>
<programlisting>
@Id
@GeneratedValue
@Column(name="ID")
private long id;

@Basic @Column(name="ANIMAL_NAME")
private String name = null;

@Basic @Column(name="COST")
private float price = 0f;
</programlisting>
                    <para>
The annotations serve to map the fields into the database. For more information
on these and other annotations, see <xref linkend="jpa_overview_meta"/>.
                    </para>
                    <orderedlist>
                        <listitem>
                            <para>
<command>@Id</command>: This annotation indicates that the field is to be
mapped to a primary key column in the database.
                            </para>
                        </listitem>
                        <listitem>
                            <para>
<command>@GeneratedValue</command>: Indicates that the implementation will
generate a value for the field automatically.
                            </para>
                        </listitem>
                        <listitem>
                            <para>
<command>@Column</command>: This annotation describes the column to which the
field will be mapped. The <command>name</command> attribute specifies the name
of the column.
                            </para>
                        </listitem>
                        <listitem>
                            <para>
<command>@Basic</command>: This annotation indicates that the field is simply
mapped into a column. There are other annotations that indicate entity
relationships and other more complex mappings.
                            </para>
                        </listitem>
                    </orderedlist>
                </listitem>
                <listitem>
                    <para>
Compile the <filename>.java</filename> files.
                    </para>
<programlisting>
javac *.java
</programlisting>
                    <para>
You can use any java compiler instead of <command>javac</command>.
                    </para>
                </listitem>
                <listitem>
                    <para>
Enhance the persistent classes. (Optional)
                    </para>
<programlisting>
java org.apache.openjpa.enhance.PCEnhancer Animal.java Dog.java
</programlisting>
                    <para>
This step runs the OpenJPA enhancer on the <filename>Animal.java</filename> and
<filename>Dog.java</filename> files mentioned above. See
<xref linkend="ref_guide_pc_enhance"/> of the Reference Guide for more
information on the enhancer, including alternatives to enhancement.
                    </para>
                    <note>
                        <para>
The <literal>-p</literal> flag points the enhancer to your <filename>
persistence.xml</filename> configuration file. All OpenJPA tools look for
default configuration in a resource called <filename>openjpa.xml</filename> or
<filename>META-INF/openjpa.xml</filename>. Thus you can avoid passing the
<literal>-p</literal> argument to tools by using this configuration file name in
place of <filename>persistence.xml</filename>. See
<xref linkend="ref_guide_conf"/> in the Reference Guide for details on
OpenJPA configuration.
                        </para>
                    </note>
                </listitem>
            </orderedlist>
            <section id="jpa_tutorial_chapter2_datastore">
                <title>
                    Configuring the Datastore
                </title>
                <para>
Now that we've compiled the source files,
we're ready to set up the database. <ulink url="http://hsqldb.sourceforge.net">
Hypersonic SQL</ulink>, a pure Java relational database, is included in the
OpenJPA distribution. We have included this database because it is simple to set
up and has a small memory footprint; however, you can use this tutorial with any
of the relational databases that we support. You can also write your own plugin
for any database that we do not support. For the sake of simplicity, this
tutorial only describes how to set up connectivity to a Hypersonic SQL database.
For more information on how to connect to a different database or how to add
support for other databases, see <xref linkend="ref_guide_dbsetup"/> of
the Reference Guide.
                </para>
                <orderedlist>
                    <listitem>
                        <para>
                        <indexterm>
                            <primary>
                                org.apache.openjpa.jdbc.meta.MappingTool
                            </primary>
                        </indexterm>
Create the object-relational mappings and database schema.
                        </para>
<programlisting>
java org.apache.openjpa.jdbc.meta.MappingTool Animal.java Dog.java
</programlisting>
                        <para>
This command propagates the necessary schema for the specified classes to the
database configured in <filename>persistence.xml</filename>. If you are using
the default Hypersonic SQL setup, the first time you run the mapping tool
Hypersonic will create <filename>tutorial_database.properties</filename> and
<filename>tutorial_database.script</filename> database files in your current
directory. To delete the database, just delete these files.
                        </para>
                        <para>
By default, JPA uses object-relational mapping information stored in annotations
in your source files. <xref linkend="jpa_overview_mapping"/> of the JPA
Overview will help you understand mapping annotations. Additionally,
<xref linkend="ref_guide_mapping"/> of the Reference Guide describes your
other mapping options in detail.
                        </para>
                        <para>
                        </para>
                        <para>
If you are curious, you can view the schema OpenJPA created for the tutorial
classes with OpenJPA's schema tool:
                        </para>
<programlisting>
java org.apache.openjpa.jdbc.schema.SchemaTool -a reflect -f tmp.schema
</programlisting>
                        <para>
This will create a <filename>tmp.schema</filename> file with an XML
representation of the database schema. The XML should be self explanatory; see
<xref linkend="ref_guide_schema_xml"/> of the Reference Guide for details.
You may delete the <filename>tmp.schema</filename> file before proceeding.
                        </para>
                    </listitem>
                    <listitem>
                        <para>
Populate the database with sample data.
                        </para>
<programlisting>
java tutorial.persistence.SeedDatabase
</programlisting>
                    </listitem>
                </orderedlist>
                <para>
Congratulations! You have now created an JPA-accessible persistent store, and
seeded it with some sample data.
                </para>
            </section>
        </section>
        <section id="jpa_tutorial_chapter3">
            <title>
                Inventory Maintenance
            </title>
            <para>
The most important element of a successful pet store product, say the experts,
is an inventory maintenance mechanism. So, let's work on the <classname>Animal
</classname> and <classname>Dog</classname> classes a bit to permit user
interaction with the database.
            </para>
            <para>
This chapter should familiarize you with some of the basics of the
<ulink url="../../ejb-3_0-pr-spec-persistence.pdf">JPA specification</ulink> and
the mechanics of compiling and enhancing persistent classes. You will also
become familiar with the mapping tool for propagating the persistent schema into
the database.
            </para>
            <para>
First, let's add some code to <filename>AnimalMaintenance.java</filename> that
allows us to examine the animals currently in the database.
            </para>
            <orderedlist>
                <listitem>
                    <para>
Add code to <filename>AnimalMaintenance.java</filename>.
                    </para>
                    <para>
Modify the <methodname>getAnimals</methodname> method of <filename>
AnimalMaintenance.java</filename> to look like this:
                    </para>
<programlisting>
    /**
     *  Return a list of animals that match the specified query filter.
     *
     *  @param  filter      the JPQL filter to apply to the query
     *  @param  cls         the class of animal to query on
     *  @param  em          the EntityManager to obtain the query from
     */
    public static List getAnimals (String filter, EntityManager em)
    {
        // Execute a query for the specified filter.
        Query query = em.createQuery (filter);
        return query.getResultList ();
    }
</programlisting>
                </listitem>
                <listitem>
                    <para>
Compile <filename>AnimalMaintenance.java</filename>.
                    </para>
<programlisting>
javac AnimalMaintenance.java
</programlisting>
                </listitem>
                <listitem>
                    <para>
Take a look at the animals in the database.
                    </para>
<programlisting>
java tutorial.persistence.AnimalMaintenance list Animal
</programlisting>
                    <para>
Notice that <methodname>list</methodname> optionally takes a query filter. Let's
explore the database some more, this time using filters:
                    </para>
<programlisting>
java tutorial.persistence.AnimalMaintenance list "select a from Animal a where a.name = 'Binney'"
java tutorial.persistence.AnimalMaintenance list "select a from Animal a where a.price &lt;= 50"
</programlisting>
                    <para>
The Java Persistence Query Language (JPQL) is designed to look and behave much
like an object oriented SQL dialect. The <literal>name</literal> and <literal>
price</literal> fields identified in the above queries map to the member fields
of those names in <classname> tutorial.persistence.Animal</classname>. More
details on JPQL syntax is available in <xref linkend="jpa_overview_query"/>
 of the JPA Overview.
                    </para>
                </listitem>
            </orderedlist>
            <para>
Great! Now that we can see the contents of the database, let's add some code
that lets us add and remove animals.
            </para>
            <section id="jpa_tutorial_chapter3_persist">
                <title>
                    Persisting Objects
                </title>
                <para>
As new dogs are born or acquired, the store owner will need to add new records
to the inventory database. In this section, we'll write the code to handle
additions through the <classname>tutorial.persistence.AnimalMaintenance
</classname> class.
                </para>
                <para>
This section will familiarize you with the mechanism for storing persistent
instances in a JPA entity manager. We will create a new dog, obtain a
<classname>Transaction</classname> from a <classname>EntityManager</classname>,
and, within the transaction, make the new dog object persistent.
                </para>
                <para>
<classname>tutorial.persistence.AnimalMaintenance</classname> provides a
reflection-based facility for creating any type of animal, provided that the
animal has a two-argument constructor whose first argument corresponds to the
name of the animal and whose second argument is an implementation-specific
primitive. This reflection-based system is in place to keep this tutorial short
and remove repetitive creation mechanisms. It is not a required part of the JPA
specification.
                </para>
                <orderedlist>
                    <listitem>
                        <para>
Add the following code to <filename> AnimalMaintenance.java</filename>.
                        </para>
                        <para>
Modify the <methodname>persistObject</methodname> method of <filename>
AnimalMaintenance.java</filename> to look like this:
                        </para>
<programlisting>
    /**
     *  Performs the actual JPA work of putting &lt;code&gt;object&lt;/code&gt;
     *  into the data store.
     *
     *  @param  object  the object to persist in the data store
     */
    public static void persistObject (EntityManager em, Object object)
    {
        // Mark the beginning of the unit of work boundary.
        em.getTransaction ().begin ();

        em.persist (object);

        // Mark the end of the unit of work boundary,
        // and record all inserts in the database.
        em.getTransaction ().commit ();
        System.out.println ("Added " + object);
    }
</programlisting>
                        <note>
                            <para>
In the above code, we pass in an <classname>EntityManager</classname>.
<classname>EntityManager</classname>s may be either container managed or
application managed. In this tutorial, because we're operating outside a
container, we're using application managed <classname>EntityManager</classname>
s. In managed environments, <classname>EntityManager</classname>s are typically
container managed, and thus injected or looked up via JNDI. Application managed
<classname>EntityManager</classname>s can be used in both managed and unmanaged
environments, and are created by an <classname>EntityManagerFactory</classname>
. An <classname>EntityManagerFactory</classname> can be obtained from the
<classname>javax.persistence.Persistence</classname> class. This class provides
some convenience methods for obtaining an <classname>EntityManagerFactory
</classname>.
                            </para>
                        </note>
                    </listitem>
                    <listitem>
                        <para>
Recompile <filename>AnimalMaintenance.java</filename>.
                        </para>
<programlisting>
javac AnimalMaintenance.java
</programlisting>
                    </listitem>
                </orderedlist>
                <para>
You now have a mechanism for adding new dogs to the database. Go ahead and add
some by running <command>java tutorial.persistence.AnimalMaintenance add Dog
&lt;name&gt; &lt;price&gt;</command> For example:
                </para>
<programlisting>
java tutorial.persistence.AnimalMaintenance add Dog Fluffy 35
</programlisting>
                <para>
You can view the contents of the database with:
                </para>
<programlisting>
java tutorial.persistence.AnimalMaintenance list Dog
</programlisting>
            </section>
            <section id="jpa_tutorial_chapter3_delete">
                <title>
                    Deleting Objects
                </title>
                <para>
What if someone decides to buy one of the dogs? The store owner will need to
remove that animal from the database, since it is no longer in the inventory.
                </para>
                <para>
This section demonstrates how to remove data from the datastore.
                </para>
                <orderedlist>
                    <listitem>
                        <para>
Add the following code to <filename>AnimalMaintenance.java</filename>.
                        </para>
                        <para>
Modify the <methodname>deleteObjects</methodname> method of <filename>
AnimalMaintenance.java</filename> to look like this:
                        </para>
<programlisting>
    /**
     *  Performs the actual JPA work of removing 
     *  &lt;code&gt;objects&lt;/code&gt; from the datastore.
     *
     *  @param  objects     the objects to persist in the datastore
     *  @param  em          the EntityManager to delete with
     */
    public static void deleteObjects (Collection objects, EntityManager em)
    {
        // Mark the beginning of the unit of work boundary.
        em.getTransaction ().begin ();

        // This method removes the objects in 'objects' from the data store.
        for (Object ob : objects)
        {
            System.out.println ("Removed animal: " + ob);
            em.remove (ob);
        }

        // Mark the end of the unit of work boundary, and record all
        // deletes in the database.
        em.getTransaction ().commit ();
    }
</programlisting>
                    </listitem>
                    <listitem>
                        <para>
Recompile <filename>AnimalMaintenance.java</filename>.
                        </para>
<programlisting>
javac AnimalMaintenance.java
</programlisting>
                    </listitem>
                    <listitem>
                        <para>
Remove some animals from the database.
                        </para>
<programlisting>
java tutorial.persistence.AnimalMaintenance remove &lt;query&gt;
</programlisting>
                        <para>
Where <replaceable>&lt;query&gt;</replaceable> is a query string like those used
for listing animals above.
                        </para>
                    </listitem>
                </orderedlist>
                <para>
All right. We now have a basic pet shop inventory management system. From this
base, we will add some of the more advanced features suggested by our industry
experts.
                </para>
            </section>
        </section>
        <section id="jpa_tutorial_chapter4">
            <title>
                Inventory Growth
            </title>
            <para>
Now that we have the basic pet store framework in place, let's add support for
the next pet in our list: the rabbit. The rabbit is a bit different than the
dog; pet stores sell them all for the same price, but gender is critically
important since rabbits reproduce rather easily and quickly. Let's put together
a class representing a rabbit.
            </para>
            <para>
In this chapter, you will see some more queries and write a bidirectional
relation between objects.
            </para>
            <para>
Provided with this tutorial is a file called <filename>Rabbit.java</filename>
which contains a sample <classname>Rabbit</classname> implementation.
            </para>
            <orderedlist>
                <listitem>
                    <para>
Examine <filename>Rabbit.java</filename>.
                    </para>
                </listitem>
                <listitem>
                    <para>
The Rabbit class above contains a bidirectional relationship between parents and
children. From the Java side of things, a bidirectional relationship is simply a
pair of fields that are conceptually linked. There is no special Java work
necessary to express bidirectionality. However, you must identify the
relationship as bidirectional using JPA <link linkend="jpa_overview_meta">
annotations</link> so the mapping tool can create the most efficient schema.
                    </para>
                    <para>
Insert this snippet of code immediately <emphasis>before</emphasis> the
<literal>children</literal> field declaration in the <filename>Rabbit.java
</filename> file.
                    </para>
<programlisting>
    @ManyToMany
    @JoinTable(name="RABBIT_CHILDREN",
        joinColumns=@JoinColumn(name="PARENT_ID"),
        inverseJoinColumns=@JoinColumn(name="CHILD_ID"))
</programlisting>
                    <para>
The <literal>@ManyToMany</literal> annotation indicates that <literal>children
</literal> is one side of a many-to-many relation. <literal>@JoinTable</literal>
describes how this relation maps to a database join table. The annotation's
<literal>joinColumns</literal> name the join table's foreign key columns linking
to the owning instance (the parent). In this case, column <literal>
RABBIT_CHILDREN.PARENT_ID</literal> is a foreign key to the parent's <literal>
ID</literal> primary key column. Similarly, the <literal>inverseJoinColumns
</literal> attribute denotes the foreign key columns linking to the collection
elements (the children). For more details on the <literal>@JoinTable</literal>
annotation, see <xref linkend="jpa_overview_mapping"/> of the JPA
Overview.
                    </para>
                    <para>
Now we'll map the other side of this bidirectional relation, the <literal>
parents</literal> field. Insert the following snippet of code immediately
<emphasis>before</emphasis> the <command>parents</command> field declaration in
the <filename>Rabbit.java</filename> file. The <literal>mappedBy</literal>
attribute identifies the name of the owning side of the relation.
                    </para>
<programlisting>
    @ManyToMany(mappedBy="children")
</programlisting>
                </listitem>
                <listitem>
                    <para>
Compile <filename>Rabbit.java</filename>.
                    </para>
<programlisting>
javac Rabbit.java
</programlisting>
                </listitem>
                <listitem>
                    <para>
Enhance the <classname>Rabbit</classname> class. (Optional)
                    </para>
<programlisting>
java org.apache.openjpa.enhance.PCEnhancer Rabbit.java
</programlisting>
                </listitem>
                <listitem>
                    <para>
Refresh the object-relational mappings and database schema.
                    </para>
<programlisting>
java org.apache.openjpa.jdbc.meta.MappingTool Rabbit.java
</programlisting>
                </listitem>
            </orderedlist>
            <para>
Now that we have a Rabbit class, let's get some preliminary rabbit data into the
database.
            </para>
            <orderedlist>
                <listitem>
                    <para>
Add a <literal>&lt;class&gt;</literal> entry for <classname> Rabbit</classname>
to <filename>../../META-INF/persistence.xml</filename>.
                    </para>
<programlisting>
&lt;class&gt;tutorial.persistence.Rabbit&lt;/class&gt;
</programlisting>
                </listitem>
                <listitem>
                    <para>
Create some rabbits.
                    </para>
                    <para>
Run the following commands a few times to add some male and female rabbits to
the database:
                    </para>
<programlisting>
java tutorial.persistence.AnimalMaintenance add Rabbit &lt;name&gt; false
java tutorial.persistence.AnimalMaintenance add Rabbit &lt;name&gt; true
</programlisting>
                    <para>
Now run some breeding iterations.
                    </para>
<programlisting>
java tutorial.persistence.Rabbit breed 2
</programlisting>
                </listitem>
                <listitem>
                    <para>
Look at your new rabbits.
                    </para>
<programlisting>
java tutorial.persistence.AnimalMaintenance list Rabbit
java tutorial.persistence.AnimalMaintenance details "select r from Rabbit r where r.name = '&lt;name&gt;'"
</programlisting>
                </listitem>
            </orderedlist>
        </section>
        <section id="jpa_tutorial_chapter5">
            <title>
                Behavioral Analysis
            </title>
            <para>
Often, pet stores sell snakes as well as rabbits and dogs. Pet stores are
primarily concerned with a snake's length; much like rabbits, pet store
operators usually sell them all for a flat rate.
            </para>
            <para>
This chapter demonstrates more queries, schema manipulation, and additional
relation types.
            </para>
            <para>
Provided with this tutorial is a file called <filename>Snake.java</filename>
which contains a sample <classname>Snake</classname> implementation. Let's get
it compiled and loaded:
            </para>
            <orderedlist>
                <listitem>
                    <para>
Examine and compile <filename>Snake.java</filename>.
                    </para>
<programlisting>
javac Snake.java
</programlisting>
                </listitem>
                <listitem>
                    <para>
Enhance the class. (Optional)
                    </para>
<programlisting>
java org.apache.openjpa.enhance.PCEnhancer Snake.java
</programlisting>
                </listitem>
                <listitem>
                    <para>
Refresh the mappings and database.
                    </para>
                    <para>
As we have created a new persistent class, we must map it to the database and
change the schema to match. So run the mapping tool:
                    </para>
<programlisting>
java org.apache.openjpa.jdbc.meta.MappingTool Snake.java
</programlisting>
                </listitem>
                <listitem>
                    <para>
Add a <literal>&lt;class&gt;</literal> entry for <classname> Snake</classname>
to <filename>../../META-INF/persistence.xml</filename>.
                    </para>
<programlisting>
&lt;class&gt;tutorial.persistence.Snake&lt;/class&gt;
</programlisting>
                </listitem>
            </orderedlist>
            <para>
Once you have compiled everything, add a few snakes to the database using:
            </para>
<programlisting>
java tutorial.persistence.AnimalMaintenance add Snake "name" &lt;length&gt;
</programlisting>
            <para>
Where <replaceable>&lt;length&gt;</replaceable> is the length in feet for the
new snake. To see the new snakes in the database, run:
            </para>
<programlisting>
java tutorial.persistence.AnimalMaintenance list Snake
</programlisting>
            <para>
Unfortunately for the massively developing rabbit population, snakes often eat
rabbits. Any good inventory system should be able to capture this behavior. So,
let's add some code to <filename>Snake.java</filename> to support the snake's
eating behavior.
            </para>
            <para>
First, let's modify <filename>Snake.java</filename> to contain a list of eaten
rabbits.
            </para>
            <orderedlist>
                <listitem>
                    <para>
Add the following code snippets to <filename>Snake.java</filename>.
                    </para>
<programlisting>
    // This list will be persisted into the database as
    // a one-to-many relation.
    @OneToMany(mappedBy="eater")
    private Set&lt;Rabbit&gt; giTract = new HashSet&lt;Rabbit&gt; ();
</programlisting>
                    <para>
Note that we specified a <literal>mappedBy</literal> attribute in this example.
This is because the relation is bidirectional; that is, the rabbit has knowledge
of which snake ate it. We could have left out the <literal>eater</literal> field
and instead created a standard unidirectional relation. In fact, in a
bidirectional many-to-one relation, the many side must always be the owner.
                    </para>
                    <para>
For more information on types of relations, see
<xref linkend="jpa_overview_mapping_field"/> of the JPA Overview.
                    </para>
                    <para>
Modify the <literal>toString (boolean)</literal> method to output the giTract
list.
                    </para>
<programlisting>
    public String toString (boolean detailed)
    {
        StringBuffer buf = new StringBuffer (1024);
        buf.append ("Snake ").append (getName ());

        if (detailed)
        {
            buf.append (" (").append (length).append (" feet long) sells for ");
            buf.append (getPrice ()).append (" dollars.");
            buf.append ("  Its gastrointestinal tract contains:\n");
            for (Rabbit rabbit : giTract)
                buf.append ("\t").append (rabbit).append ("\n");
        }
        else
            buf.append ("; ate " + giTract.size () + " rabbits.");

        return buf.toString ();
    }
</programlisting>
                    <para>
Add the following methods.
                    </para>
<programlisting>
    /**
     *  Kills the specified rabbit and eats it.
     */
    public void eat (Rabbit dinner)
    {
        // Consume the rabbit.
        dinner.kill ();
        dinner.setEater (this);
        giTract.add (dinner);
        System.out.println ("Snake " + getName () + " ate rabbit " 
            + dinner.getName () + ".");
    }


    /**
     *  Locates the specified snake and tells it to eat a rabbit.
     */
    public static void eat (EntityManager em, String filter)
    {
        em.getTransaction ().begin ();

        // Find the desired snake(s) in the data store.
        Query query = em.createQuery (filter);
        List&lt;Snake&gt; results = query.getResultList ();
        if (results.isEmpty ())
        {
            System.out.println ("No snakes matching '" + filter + "' found");
            return;
        }

        Query uneatenQuery = em.createQuery
            ("select r from Rabbit r where r.isDead = false");
        Random random = new Random ();
        for (Snake snake : results)
        {
            // Run a query for a rabbit whose 'isDead' field indicates
            // that it is alive.
            List&lt;Rabbit&gt; menu = uneatenQuery.getResultList ();
            if (menu.isEmpty ())
            {
                System.out.println ("No live rabbits in DB.");
                break;
            }

            // Select a random rabbit from the list.
            Rabbit dinner = menu.get (random.nextInt (menu.size ()));

            // Perform the eating.
            System.out.println (snake + " is eating:");
            snake.eat (dinner);
        }

        em.getTransaction ().commit ();
    }


    public static void main (String[] args)
    {
        if (args.length == 2 &amp;&amp; args[0].equals ("eat"))
        {
            EntityManagerFactory emf = Persistence.
                createEntityManagerFactory (null);
            EntityManager em = emf.createEntityManager ();
            eat (em, args[1]);
            em.close ();
            emf.close ();
            return;
        }

        // If we get here, something went wrong.
        System.out.println ("Usage:");
        System.out.println ("  java tutorial.persistence.Snake eat "
            + "\"snakequery\"");
    }
</programlisting>
                </listitem>
                <listitem>
                    <para>
Add an <literal>eater</literal> field to <filename>Rabbit.java</filename>, and
a getter and setter.
                    </para>
<programlisting>
    @ManyToOne @JoinColumn(name="EATER_ID")
    private Snake eater;

    ...

    public Snake getEater ()
    {
        return eater;
    }


    public void setEater (Snake snake)
    {
        eater = snake;
    }
</programlisting>
                    <para>
The <literal>@ManyToOne</literal> annotation indicates that this is the many
side of the bidirectional relation. The many side must always be the owner in
this type of relation. The <literal>@JoinColumn</literal> describes the foreign
key that joins the rabbit table to the snake table. The rabbit table has an
<literal>EATER_ID</literal> column that is a foreign key to the <literal>ID
</literal> primary key column of the snake table.
                    </para>
                </listitem>
                <listitem>
                    <para>
Compile <filename>Snake.java</filename> and <filename>Rabbit.java</filename> and
optionally enhance the classes.
                    </para>
<programlisting>
javac Snake.java Rabbit.java
java org.apache.openjpa.enhance.PCEnhancer Snake.java Rabbit.java
</programlisting>
                </listitem>
                <listitem>
                    <para>
Refresh the mappings and database.
                    </para>
<programlisting>
java org.apache.openjpa.jdbc.meta.MappingTool Snake.java Rabbit.java
</programlisting>
                </listitem>
            </orderedlist>
            <para>
Now, experiment with the following commands:
            </para>
<programlisting>
java tutorial.persistence.Snake eat "select s from Snake s where s.name = '&lt;name&gt;'"
java tutorial.persistence.AnimalMaintenance details "select s from Snake s where s.name = '&lt;name&gt;'"
</programlisting>
            <section id="jpa_tutorial_chapter5_query">
                <title>
                    Complex Queries
                </title>
                <para>
Imagine that one of the snakes in the database was named Killer. To find out
which rabbits Killer ate, we could run either of the following two queries:
                </para>
<programlisting>
java tutorial.persistence.AnimalMaintenance details "select s from Snake s where s.name = 'Killer'"
java tutorial.persistence.AnimalMaintenance list "select r from Rabbit r where r.eater.name = 'Killer'"
</programlisting>
                <para>
The first query is snake-centric - the query runs against the <classname>Snake
</classname> class, looking for all snakes named Killer and providing a detailed
listing of them. The second is rabbit-centric - it examines the rabbits in the
database for instances whose <literal>eater</literal> is named Killer. This
second query demonstrates the that simple java 'dot' syntax is used when
traversing an to-one field in a query.
                </para>
                <para>
It is also possible to traverse collection fields. Imagine that there was a
rabbit called Roger in the datastore and that one of the snakes ate it. In order
to determine who ate Roger Rabbit, you could run a query like this:
                </para>
<programlisting>
java tutorial.persistence.AnimalMaintenance details "select s from Snake s inner join s.giTract r where r.name = 'Roger'"
</programlisting>
            </section>
        </section>
        <section id="jpa_tutorial-chapter6">
            <title>
                Extra Features
            </title>
            <para>
Congratulations! You are now the proud author of a pet store inventory suite.
Now that you have all the major features of the pet store software implemented,
it's time to add some extra features. You're on your own; think of some features
that you think a pet store should have, or just explore the features of JPA.
            </para>
            <para>
Here are a couple of suggestions to get you started:
            </para>
            <itemizedlist>
                <listitem>
                    <para>
Animal pricing.
                    </para>
                    <para>
Modify <classname>Animal</classname> to contain an inventory cost and a resale
price. Calculate the real dollar amount eaten by the snakes (the sum of the
inventory costs of all the consumed rabbits), and the cost assuming that all the
eaten rabbits would have been sold had they been alive. Ignore the fact that the
rabbits, had they lived, would have created more rabbits, and the implications
of the reduced food costs due to the not-quite-as-hungry snakes and the smaller
number of rabbits.
                    </para>
                </listitem>
                <listitem>
                    <para>
Dog categorization.
                    </para>
                    <para>
Modify <classname>Dog</classname> to have a relation to a new class called
<classname>Breed</classname>, which contains a name identifying the breed of
the dog and a description of the breed. Put together an admin tool for breeds
and for associating dogs and breeds.
                    </para>
                </listitem>
            </itemizedlist>
        </section>
    </section>
    <section id="jpa_j2ee_tutorial">
        <title>
            J2EE Tutorial
        </title>
        <para>
By deploying OpenJPA into a J2EE environment, you can maintain the simplicity
and performance of OpenJPA, while leveraging J2EE technologies such as container
managed transactions (JTA/JTS), enterprise objects with remote invocation (EJB),
and managed deployment of multi-tiered applications via an application server.
This tutorial will demonstrate how to deploy OpenJPA-based J2EE applications and
showcase some basic enterprise JPA design techniques. The tutorial's sample
application models a basic garage catalog system. While the application is
relatively trivial, the code has been constructed to illustrate simple patterns
and solutions to common problems when using OpenJPA in an enterprise
environment.
        </para>
        <section id="jpa_j2ee_tutorial_requirements">
            <title>
                Prerequisites for the OpenJPA J2EE Tutorial
            </title>
            <para>
This tutorial assumes that you have installed OpenJPA and setup your classpath
according to the installation instructions appropriate for your platform. In
addition, this tutorial requires that you have installed and configured a
J2EE-compliant application server, such as WebLogic or JBoss, running on JDK
1.5. If you use a different application server not listed here, this tutorial
may be adaptable to your application server with small changes; refer to your
application server's documentation for any specific classpath and deployment
descriptor requirements.
            </para>
            <para>
This tutorial assumes a reasonable level of experience with OpenJPA and JPA. We
provide a number of other tutorials for basic concepts, including enhancement,
schema mapping, and configuration. This tutorial also assumes a basic level of
experience with J2EE components, including session beans, JNDI, JSP, and
EAR/WAR/JAR packaging. Sun and/or your application server company may provide
tutorials to get familiar with these components.
            </para>
            <para>
In addition, this tutorial uses Ant to build the deployment archives. While this
is the preferred way of building a deployment of the tutorial, one can easily
build the appropriate JAR, WAR, and EAR files by hand, although that is outside
the scope of this document.
            </para>
        </section>
        <section id="jpa_j2ee_tutorial_installation_types">
            <title>
                J2EE Installation Types
            </title>
            <para>
Every application server has a different installation process for installing
J2EE components. OpenJPA can be installed in a number of ways, which may or may
not be appropriate to your application server. While this document focuses
mainly upon using OpenJPA as a JCA resource, there are other ways to use OpenJPA
in a J2EE environment.
            </para>
            <itemizedlist>
                <listitem>
                    <para>
<literal>JPA</literal>: J2EE 5 allows for the automatic injection of <classname>
EntityManager</classname> instances into the J2EE context.
                    </para>
                </listitem>
                <listitem>
                    <para>
Manual Binding into JNDI: Your application may require some needs in
initializing OpenJPA that go beyond the JPA and JCA specifications. In this
case, you can manually instantiate OpenJPA and place it into the JNDI tree. This
process, however, is not seamless and can require a fair bit of custom
application server code to bind an instance of <classname>
org.apache.openjpa.persistence.EntityManagerFactoryImpl</classname> into JNDI.
                    </para>
                </listitem>
            </itemizedlist>
        </section>
        <section id="jpa_j2ee_tutorial_installing_sample">
            <title>
                Installing the J2EE Sample Application
            </title>
            <para>
Installing the sample application involves first compiling and building a
deployment archive (.ear) file. This file then needs to be deployed into your
application server.
            </para>
            <section id="jpa_j2ee_tutorial_building_sample">
                <title>
                    Compiling and Building The Sample Application
                </title>
                <para>
Navigate to the <filename>samples/persistence/j2ee</filename> directory of your
OpenJPA installation.
                </para>
                <para>
Ensure that the JNDI name in the setSessionContext() method in ejb/CarBean.java
matches your JCA installation. This defaults to <literal>java:/openjpa-ejb
</literal>, but the actual value will depend on the configuration of your JCA
deploy and your application server's JNDI context. E.g. the default name for a
WebLogic 9 install would be simply <literal>openjpa-ejb</literal>.
                </para>
                <para>
Compile the source files in place both in this base directory as well as the
nested <filename>ejb</filename> and <filename>jsp</filename> directories:
                </para>
<programlisting>
javac *.java  ejb/*.java jsp/*.java
</programlisting>
                <para>
Enhance the Car class. (Optional)
                </para>
<programlisting>
java org.apache.openjpa.enhance.PCEnhancer Car.java
</programlisting>
                <para>
Run the mapping tool; make sure that your <filename> META-INF/persistence.xml
</filename> file includes the same connection information (e.g. Driver, URL,
etc.) as your JCA installation. You should update your JCA configuration to
include <classname>samples.persistence.j2ee.Car</classname> in the
<link linkend="openjpa.MetaDataFactory">MetaDataFactory</link> property:
                </para>
<programlisting>
&lt;config-property name="MetaDataFactory"&gt;Types=samples.persistence.j2ee.Car&lt;/config-property/&gt;
</programlisting>
<programlisting>
java org.apache.openjpa.jdbc.meta.MappingTool Car.java
</programlisting>
                <para>
Build an J2EE application archive by running Ant against the <filename>
build.xml</filename>. This will create <filename>
openjpa-persistence-j2ee-sample.ear</filename>. This ear can now be deployed to
your appserver. Be sure to add the class <classname>samples.j2ee.Car</classname>
to the <literal>openjpa.PersistentClasses</literal> OpenJPA configuration
property. This will automatically register the Entity.
                </para>
<programlisting>
ant -f build.xml
</programlisting>
            </section>
            <section id="jpa_j2ee_tutorial_sample_jboss">
                <title>
                    Deploying Sample To JBoss
                </title>
                <para>
Place the ear file in the <filename>deploy</filename> directory of your JBoss
installation. You can use the above hints to view the JNDI tree to see if
<classname>samples.j2ee.ejb.CarHome</classname> was deployed to JNDI.
                </para>
            </section>
            <section id="jpa_j2ee_tutorial_sample_weblogic">
                <title>
                    Deploying Sample To WebLogic 9
                </title>
                <para>
Place the ear file in the <filename>autodeploy</filename> directory of your
WebLogic domain. Production mode (see your startWebLogic.sh/cmd file) should be
set to false to enable auto-deployment. If the application was installed
correctly, you should see <computeroutput>openjpa-persistence-j2ee-sample
</computeroutput> listed in the Deployments section of the admin console. In
addition you should find <literal>CarHome</literal> listed in the JNDI tree
under <computeroutput>AdminServer-&gt;samples-&gt;j2ee-&gt;ejb</computeroutput>
. Ensure that you have added the class <classname>samples.j2ee.Car</classname>
to the <literal>openjpa.PersistentClasses</literal> OpenJPA configuration
property in the <literal>META-INF/ra.xml</literal> file.
                </para>
            </section>
        </section>
        <section id="jpa_j2ee_tutorial_using">
            <title>
                Using The Sample Application
            </title>
            <para>
The sample application installs itself into the web layer at the context root of
sample. By browsing to <computeroutput>
http://yourserver:yourport/openjpa-persistence-j2ee-sample</computeroutput>,
you should be presented with a simple list page with no cars. You can edit, add,
delete car instances. In addition, you can query on the underlying <classname>
Car</classname> instances by passing in an JPQL query into the marked form (such
as <computeroutput>select car from Car car where car.model="Some Model"
</computeroutput> ).
            </para>
        </section>
        <section id="jpa_j2ee_tutorial_architecture">
            <title>
                Sample Architecture
            </title>
            <para>
The garage application is a simple enterprise application that demonstrates some
of the basic concepts necessary when using OpenJPA in the enterprise layer.
            </para>
            <para>
The core model wraps a stateless session bean facade around an entity. Using a
session bean provides both a remote interface for various clients as well as
providing a transactional context in which to work (and thus avoiding any
explicit transactional code).
            </para>
            <para>
This session bean uses the JPA's detachment capabilities to provide an automatic
Data Transfer Object mechanism for the primary communication between the
application server and the (possibly remote) client. The <classname>Car
</classname> instance will be used as the primary object upon which the client
will work.
            </para>
            <itemizedlist>
                <listitem>
                    <para>
<literal>samples/persistence/j2ee/Car.java</literal>: The core of the sample
application. This is the entity class that OpenJPA will use to persist the
application data. Instances of this class will also fill the role of data
transfer object (DTO) for EJB clients. To accomplish this, <classname>Car
</classname> implements <classname>java.io.Serializable</classname> so that
remote clients can access cars as parameters and return values from the EJB.
                    </para>
                </listitem>
                <listitem>
                    <para>
<literal> samples/persistence/j2ee/jsp/SampleUtilities.java</literal>: This is
a simple facade to aggregate some common J2EE behavior into some static methods.
By placing all of the functionality into a single facade class, we can reduce
code maintenance of our JSPs.
                    </para>
                </listitem>
                <listitem>
                    <para>
<literal>samples/persistence/j2ee/ejb/Car*.java</literal>: The source for the
<classname>CarEJB</classname> session bean. Clients can use the <classname>
CarHome</classname> and <classname>CarRemote</classname> interfaces to find,
manipulate, and persist changes to <classname>Car</classname> transfer object
instances. By using J2EE transactional features, the implementation code in
<filename>CarBean.java</filename> can be focused almost entirely upon business
and persistence logic without worrying about transactions.
                    </para>
                </listitem>
                <listitem>
                    <para>
<literal>samples/persistence/j2ee/jsp/*.jsp</literal>: The web presentation
client. These JSPs are not aware of the JPA; they simply use the <classname>
CarEJB</classname> session bean and the <classname>Car</classname> transfer
object to do all the work.
                    </para>
                </listitem>
                <listitem>
                    <para>
<literal>samples/persistence/j2ee/resources/*</literal>: Files required to
deploy to the various appservers, including J2EE deployment descriptors, WAR/
EJB/ EAR descriptors, as well as appserver specific files.
                    </para>
                </listitem>
                <listitem>
                    <para>
<literal>samples/persistence/j2ee/build.xml</literal>: A simple Ant build file
to help in creating a J2EE EAR file.
                    </para>
                </listitem>
            </itemizedlist>
        </section>
        <section id="jpa_j2ee_tutorial_notes">
            <title>
                Code Notes and J2EE Tips
            </title>
            <orderedlist>
                <listitem>
                    <para>
Entity classes are excellent candidates for the Data Transfer Object Pattern.
This pattern attempts to reduce network load, as well as group business logic
into concise units. For example, <methodname>CarBean.edit</methodname> allows
you to ensure that all values are correct before committing a transaction,
instead of sequentially calling getters and setters on the session facade. This
is especially true when using RMI such as from a Swing based application
connecting to an application server.
                    </para>
                    <para>
<classname>CarEJB</classname> works as a session bean facade to demarcate
transactions, provide finder methods, and encapsulate complex business logic at
the server level.
                    </para>
                </listitem>
                <listitem>
                    <para>
<methodname>EntityManager.close()</methodname> should be called at the end of
every EJB method. In addition to ensuring that your code will not attempt to
access a closed <classname>EntityManager</classname>, it allows OpenJPA to free
up unused resources. Since an <classname>EntityManager</classname> is created
for every transaction, this can increase the scalability of your application.
                    </para>
                </listitem>
                <listitem>
                    <para>
You should not use <methodname> EntityManager.getTransaction()</methodname> when
using JTA to manage your transactions. Instead, OpenJPA will integrate with JTA
to automatically govern transactions based on your EJB transaction
configuration.
                    </para>
                </listitem>
                <listitem>
                    <para>
While serialization of entity instances is relatively straightforward, there are
several things to keep in mind:
                    </para>
                    <itemizedlist>
                        <listitem>
                            <para>
While "default fetch group" values will always be returned to the client upon
serialization, lazily loaded fields will not as the <classname>EntityManager
</classname> will have been closed before those fields attempt to serialize. You
can either access those fields before serialization, configure the fetch type of
the relationships, or configure your JPQL queries to eagerly fetch data.
                            </para>
                        </listitem>
                    </itemizedlist>
                </listitem>
                <listitem>
                    <para>
It is not necessarily required that you use EJBs and container-managed
transactions to demarcate transactions, although that is probably the most
common method. In EJBs using bean managed transactions, you can control
transactions through the <classname>javax.transaction.UserTransaction
</classname> interface. Furthermore, outside of session beans you can control
the JPA layer's transaction via the <classname>
javax.persistence.EntityTransaction</classname> interface.
                    </para>
                </listitem>
                <listitem>
                    <para>
<classname>EntityManager</classname>s are allocated on a per-Transaction basis.
Calling <methodname>getEntityManager</methodname> from the same <classname>
EntityManagerFactory</classname> within the same EJB method call will always
return the same entity manager, although the user-visible object may be proxied,
so might not compare equal using the <literal>==</literal> operator.
                    </para>
                </listitem>
            </orderedlist>
        </section>
    </section>
</chapter>
