<?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_overview_arch">
    <title>
        Java Persistence API Architecture
    </title>
    <indexterm zone="jpa_overview_arch">
        <primary>
            JPA
        </primary>
        <secondary>
            architecture
        </secondary>
    </indexterm>
    <para>
The diagram below illustrates the relationships between the primary components
of the JPA architecture.
    </para>
    <mediaobject>
        <imageobject>
            <!-- PNG image data 400 x 256 (see README) -->
            <imagedata fileref="img/jpa-arch.png" width="267px"/>
            
        </imageobject>
        <textobject>
            <phrase>
                JPA architecture
            </phrase>
        </textobject>
    </mediaobject>
    <note>
        <para>
A number of the depicted interfaces are only required outside of an
EJB3-compliant application server. In an application server, <classname>
EntityManager</classname> instances are typically injected, rendering the
<classname>EntityManagerFactory</classname> unnecessary. Also, transactions
within an application server are handled using standard application server
transaction controls. Thus, the <classname>EntityTransaction</classname> also
goes unused.
        </para>
    </note>
    <itemizedlist>
        <listitem>
            <para>
            <indexterm>
                <primary>
                    Persistence
                </primary>
            </indexterm>
<emphasis role="bold"><link linkend="jpa_overview_persistence"><classname>
Persistence</classname></link></emphasis>: The <classname>
javax.persistence.Persistence</classname> class contains static helper methods
to obtain <classname>EntityManagerFactory</classname> instances in a
vendor-neutral fashion.
            </para>
        </listitem>
        <listitem>
            <para>
            <indexterm>
                <primary>
                    EntityManagerFactory
                </primary>
            </indexterm>
<emphasis role="bold"><link linkend="jpa_overview_emfactory"><classname>
EntityManagerFactory</classname></link></emphasis>: The <classname>
javax.persistence.EntityManagerFactory</classname> class is a factory for
<classname> EntityManager</classname> s.
            </para>
        </listitem>
        <listitem>
            <para>
            <indexterm>
                <primary>
                    EntityManager
                </primary>
            </indexterm>
<emphasis role="bold"><link linkend="jpa_overview_em"><classname>EntityManager
</classname></link></emphasis>: The <classname>javax.persistence.EntityManager
</classname> is the primary JPA interface used by applications. Each
<classname>EntityManager</classname> manages a set of persistent objects, and
has APIs to insert new objects and delete existing ones. When used outside the
container, there is a one-to-one relationship between an <classname>
EntityManager</classname> and an <classname> EntityTransaction</classname>.
<classname> EntityManager</classname>s also act as factories for <classname>
Query</classname> instances.
            </para>
        </listitem>
        <listitem>
            <para>
            <indexterm>
                <primary>
                    entity
                </primary>
            </indexterm>
<emphasis role="bold"><link linkend="jpa_overview_pc"><classname>Entity
</classname></link></emphasis>: Entities are persistent objects that represent
datastore records.
            </para>
        </listitem>
        <listitem>
            <para>
            <indexterm>
                <primary>
                    EntityTransaction
                </primary>
            </indexterm>
<emphasis role="bold"><link linkend="jpa_overview_trans"><classname>
EntityTransaction</classname></link></emphasis>: Each <classname>EntityManager
</classname> has a one-to-one relation with a single <classname>
javax.persistence.EntityTransaction</classname>. <classname>
EntityTransaction</classname>s allow operations on persistent data to be 
grouped into units of work that either completely succeed or completely fail, 
leaving the datastore in its original state. These all-or-nothing operations 
are important for maintaining data integrity.
            </para>
        </listitem>
        <listitem>
            <para>
            <indexterm>
                <primary>
                    Query
                </primary>
            </indexterm>
            <indexterm>
                <primary>
                    Java Persistence Query Language
                </primary>
                <see>
                    JPQL
                </see>
            </indexterm>
            <indexterm>
                <primary>
                    JPQL
                </primary>
            </indexterm>
            <indexterm>
                <primary>
                    JPA
                </primary>
                <secondary>
                    query language
                </secondary>
                <see>
                    JPQL
                </see>
            </indexterm>
            <indexterm>
                <primary>
                    Structured Query Language
                </primary>
                <see>
                    SQL
                </see>
            </indexterm>
            <indexterm>
                <primary>
                    SQL
                </primary>
            </indexterm>
<emphasis role="bold"><link linkend="jpa_overview_query"><classname>Query
</classname></link></emphasis>: The <classname>javax.persistence.Query
</classname> interface is implemented by each JPA vendor to find persistent
objects that meet certain criteria. JPA standardizes support for queries using
both the Java Persistence Query Language (JPQL) and the Structured Query 
Language (SQL). You obtain <classname>Query</classname> instances from an 
<classname>EntityManager</classname>.
            </para>
        </listitem>
    </itemizedlist>
    <para>
The example below illustrates how the JPA interfaces interact to execute a JPQL
query and update persistent objects. The example assumes execution outside a
container.
    </para>
    <example id="jpa_overview_arch_interact_outside">
        <title>
            Interaction of Interfaces Outside Container
        </title>
<programlisting>
  // get an EntityManagerFactory using the Persistence class
  // It is not recommended to obtain a factory often, as construction of a
  // factory is a costly operation. Typically you will like to cache  
  // a factory and then refer it for repeated use
  EntityManagerFactory factory = Persistence.createEntityManagerFactory(null);

  // get an EntityManager from the factory
  EntityManager em = factory.createEntityManager();

  // Begin a transaction
  em.getTransaction().begin();

  // query for all employees who work in our research division
  // and put in over 40 hours a week average
  Query query = em.createQuery("SELECT e " +
                               "  FROM Employee e " +
                               " WHERE e.division.name = 'Research' " +
                               "   AND e.avgHours &gt; 40");
  List results = query.getResultList();

  // give all those hard-working employees a raise
  for (Object res : results) {
    Employee emp = (Employee) res;
    emp.setSalary(emp.getSalary() * 1.1);
  }

  // commit will detect all updated entities and save them in database
  em.getTransaction().commit();

  // free the resources
  em.close();
</programlisting>
    </example>
    <para>
Within a container, the <classname>EntityManager</classname> will be injected
and transactions will be handled declaratively. Thus, the in-container version 
of the example consists entirely of business logic:
    </para>
    <example id="jpa_overview_arch_interact_inside">
        <title>
            Interaction of Interfaces Inside Container
        </title>
<programlisting>
// query for all employees who work in our research division
// and put in over 40 hours a week average - note that the EntityManager em
// is injected using a @Resource annotation
Query query = em.createQuery("select e from Employee e where "
    + "e.division.name = 'Research' and e.avgHours &gt; 40");
List results = query.getResultList();

// give all those hard-working employees a raise
for (Object res : results) {
    emp = (Employee) res;
    emp.setSalary(emp.getSalary() * 1.1);
} 
</programlisting>
    </example>
    <para>
The remainder of this document explores the JPA interfaces in detail. We present
them in roughly the order that you will use them as you develop your
application.
    </para>
    <section id="jpa_overview_arch_exceptions">
        <title>
            JPA Exceptions
        </title>
        <indexterm zone="jpa_overview_arch_exceptions">
            <primary>
                JPA
            </primary>
            <secondary>
                exceptions
            </secondary>
            <seealso>
                exceptions
            </seealso>
        </indexterm>
        <indexterm>
            <primary>
                exceptions
            </primary>
            <secondary>
                JPA
            </secondary>
        </indexterm>
        <mediaobject>
            <imageobject>
                <!-- PNG image data, 427 x 355 (see README) -->
                <imagedata fileref="img/jpa-exceptions.png" width="285px"/>
                
            </imageobject>
            <textobject>
                <phrase>
                    JPA exception architecture
                </phrase>
            </textobject>
        </mediaobject>
        <para>
The diagram above depicts the JPA exception architecture. All
exceptions are unchecked. JPA uses standard exceptions where
appropriate, most notably <classname>IllegalArgumentException</classname>s and
<classname>IllegalStateException</classname>s. The specification also provides
a few JPA-specific exceptions in the <literal>javax.persistence</literal>
package. These exceptions should be self-explanatory. See the
<ulink url="http://download.oracle.com/javaee/6/api/">Javadoc</ulink> for
additional details on JPA exceptions.
        </para>
        <note>
            <para>
All exceptions thrown by OpenJPA implement
<ulink url="../javadoc/org/apache/openjpa/util/ExceptionInfo.html"><classname>
org.apache.openjpa.util.ExceptionInfo</classname></ulink> to provide you with
additional error information.
            </para>
        </note>
    </section>
</chapter>
