blob: 059799f120ab380de464abaf336728dc52bbecf4 [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_persistence">
<title>
Persistence
</title>
<indexterm zone="jpa_overview_persistence">
<primary>
Persistence
</primary>
</indexterm>
<indexterm zone="jpa_overview_persistence">
<primary>
EntityManagerFactory
</primary>
<secondary>
construction
</secondary>
</indexterm>
<indexterm zone="jpa_overview_persistence">
<primary>
Persistence
</primary>
<secondary>
getEntityManagerFactory
</secondary>
</indexterm>
<indexterm zone="jpa_overview_persistence">
<primary>
getEntityManagerFactory
</primary>
<seealso>
Persistence
</seealso>
</indexterm>
<mediaobject>
<imageobject>
<!-- PNG image data, 427 x 121 (see README) -->
<imagedata fileref="img/persistence.png" width="285px"/>
</imageobject>
</mediaobject>
<note>
<para>
OpenJPA also includes the
<ulink url="../javadoc/org/apache/openjpa/persistence/OpenJPAPersistence.html">
<classname>OpenJPAPersistence</classname></ulink> helper class to provide
additional utility methods.
</para>
</note>
<para>
Within a container, you will typically use <emphasis>injection</emphasis> to
access an <classname>EntityManagerFactory</classname>. Applications operating
of a container, however, can use the
<ulink url="http://java.sun.com/javaee/5/docs/api/javax/persistence/Persistence.html">
<classname>Persistence</classname></ulink> class to obtain <classname>
EntityManagerFactory</classname> objects in a vendor-neutral fashion.
</para>
<programlisting>
public static EntityManagerFactory createEntityManagerFactory(String name);
public static EntityManagerFactory createEntityManagerFactory(String name, Map props);
</programlisting>
<para>
Each <methodname>createEntityManagerFactory</methodname> method searches the
system for an <classname>EntityManagerFactory</classname> definition with the
given name. Use <literal>null</literal> for an unnamed factory. The optional map
contains vendor-specific property settings used to further configure the
factory.
</para>
<para>
<filename>persistence.xml</filename> files define <classname>
EntityManagerFactories</classname>. The <methodname>createEntityManagerFactory
</methodname> methods search for <filename>persistence.xml</filename> files
within the <filename>META-INF</filename> directory of any <literal>CLASSPATH
</literal> element. For example, if your <literal>CLASSPATH</literal> contains
the <filename>conf</filename> directory, you could place an <classname>
EntityManagerFactory</classname> definition in <filename>
conf/META-INF/persistence.xml</filename>.
</para>
<section id="jpa_overview_persistence_xml">
<title>
persistence.xml
</title>
<para>
The <filename>persistence.xml</filename> file format obeys the following
Document Type Descriptor (DTD):
</para>
<programlisting>
&lt;!ELEMENT persistence (persistence-unit*)&gt;
&lt;!ELEMENT persistence-unit (description?,provider?,jta-data-source?,
non-jta-data-source?,(class|jar-file|mapping-file)*,
exclude-unlisted-classes?,properties?)&gt;
&lt;!ATTLIST persistence-unit name CDATA #REQUIRED&gt;
&lt;!ATTLIST persistence-unit transaction-type (JTA|RESOURCE_LOCAL) "JTA"&gt;
&lt;!ELEMENT description (#PCDATA)&gt;
&lt;!ELEMENT provider (#PCDATA)&gt;
&lt;!ELEMENT jta-data-source (#PCDATA)&gt;
&lt;!ELEMENT non-jta-data-source (#PCDATA)&gt;
&lt;!ELEMENT mapping-file (#PCDATA)&gt;
&lt;!ELEMENT jar-file (#PCDATA)&gt;
&lt;!ELEMENT class (#PCDATA)&gt;
&lt;!ELEMENT exclude-unlisted-classes EMPTY&gt;
&lt;!ELEMENT properties (property*)&gt;
&lt;!ELEMENT property EMPTY&gt;
&lt;!ATTLIST property name CDATA #REQUIRED&gt;
&lt;!ATTLIST property value CDATA #REQUIRED&gt;
</programlisting>
<para>
The root element of a <filename>persistence.xml</filename> file is <literal>
persistence</literal>, which then contains one or more <literal>
persistence-unit</literal> definitions. Each persistence unit describes the
configuration for the entity managers created by the persistence unit's entity
manager factory. The persistence unit can specify these elements and attribtues.
</para>
<itemizedlist>
<listitem>
<para>
<literal>name</literal>: This is the name you pass to the <methodname>
Persistence.createEntityManagerFactory</methodname> methods described above. The
name attribute is required.
</para>
</listitem>
<listitem>
<para>
<literal>transaction-type</literal>: Whether to use managed
(<literal>JTA</literal>) or local (<literal>RESOURCE_LOCAL</literal>)
transaction management.
</para>
</listitem>
<listitem>
<para>
<literal>provider</literal>: If you are using a third-party JPA vendor, this
element names its implementation of the
<ulink url="http://java.sun.com/javaee/5/docs/api/javax/persistence/spi/PersistenceProvider.html">
<classname>PersistenceProvider</classname></ulink> bootstrapping interface.
</para>
<note>
<para>
Set the <literal>provider</literal> to <classname>
org.apache.openjpa.persistence.PersistenceProviderImpl</classname> to use
OpenJPA.
</para>
</note>
</listitem>
<listitem>
<para>
<literal>jta-data-source</literal>: The JNDI name of a JDBC <classname>
DataSource</classname> that is automatically enlisted in JTA transactions. This
may be an XA <classname>DataSource</classname>.
</para>
</listitem>
<listitem>
<para>
<literal>non-jta-data-source</literal>: The JNDI name of a JDBC <classname>
DataSource</classname> that is not enlisted in JTA transactions.
</para>
</listitem>
<listitem>
<para>
<literal>mapping-file</literal>*: The resource names of XML mapping files for
entities and embeddable classes. You can also specify mapping information in an
<filename>orm.xml</filename> file in your <filename>META-INF</filename>
directory. If present, the <filename>orm.xml</filename> mapping file will be
read automatically.
</para>
</listitem>
<listitem>
<para>
<literal>jar-file</literal>*: The names of jar files containing entities and
embeddable classes. The implementation will scan the jar for annotated classes.
</para>
</listitem>
<listitem>
<para>
<literal>class</literal>*: The class names of entities and embeddable classes.
</para>
</listitem>
<listitem>
<para>
<literal>properties</literal>: This element contains nested <literal>property
</literal> elements used to specify vendor-specific settings. Each <literal>
property</literal> has a name attribute and a value attribute.
</para>
<note>
<para>
The Reference Guide's <xref linkend="ref_guide_conf"/> describes OpenJPA's
configuration properties.
</para>
</note>
</listitem>
</itemizedlist>
<para>
Here is a typical <filename>persistence.xml</filename> file for a non-EE
environment:
</para>
<example id="jpa_overview_persistence_xmlex">
<title>
persistence.xml
</title>
<programlisting>
&lt;?xml version="1.0"?&gt;
&lt;persistence&gt;
&lt;persistence-unit name="openjpa"&gt;
&lt;provider&gt;org.apache.openjpa.persistence.PersistenceProviderImpl&lt;/provider&gt;
&lt;class&gt;tutorial.Animal&lt;/class&gt;
&lt;class&gt;tutorial.Dog&lt;/class&gt;
&lt;class&gt;tutorial.Rabbit&lt;/class&gt;
&lt;class&gt;tutorial.Snake&lt;/class&gt;
&lt;properties&gt;
&lt;property name="openjpa.ConnectionURL" value="jdbc:hsqldb:tutorial_database"/&gt;
&lt;property name="openjpa.ConnectionDriverName" value="org.hsqldb.jdbcDriver"/&gt;
&lt;property name="openjpa.ConnectionUserName" value="sa"/&gt;
&lt;property name="openjpa.ConnectionPassword" value=""/&gt;
&lt;property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/&gt;
&lt;/properties&gt;
&lt;/persistence-unit&gt;
&lt;/persistence&gt;
</programlisting>
</example>
</section>
<section id="jpa_overview_persistence_use">
<title>
Non-EE Use
</title>
<para>
The example below demonstrates the <classname>Persistence</classname> class in
action. You will typically execute code like this on application startup, then
cache the resulting factory for future use. This bootstrapping code is only
necessary in non-EE environments; in an EE environment <classname>
EntityManagerFactories</classname> are typically injected.
</para>
<example id="jpa_overview_persistence_getemfactory">
<title>
Obtaining an EntityManagerFactory
</title>
<programlisting>
// if your persistence.xml file does not contain all settings already, you
// can add vendor settings to a map
Properties props = new Properties();
...
// create the factory defined by the "openjpa" entity-manager entry
EntityManagerFactory emf = Persistence.createEntityManagerFactory("openjpa", props);
</programlisting>
</example>
</section>
</chapter>