blob: 53e797ae7e6090417c0eb13df10242fdee599874 [file] [log] [blame]
<?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>: Entites 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; typically
// the factory is cached for easy repeated use
EntityManagerFactory factory = Persistence.createEntityManagerFactory(null);
// get an EntityManager from the factory
EntityManager em = factory.createEntityManager(PersistenceContextType.EXTENDED);
// updates take place within transactions
EntityTransaction tx = em.getTransaction();
tx.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 the updates and free resources
tx.commit();
em.close();
factory.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://java.sun.com/javaee/5/docs/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>