blob: 45033b80074350628ba3a895d8c07c1c0eaefdca [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_meta">
<title>
Metadata
</title>
<indexterm zone="jpa_overview_meta">
<primary>
metadata
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta">
<primary>
JPA
</primary>
<secondary>
metadata
</secondary>
<seealso>
metadata
</seealso>
</indexterm>
<para>
JPA requires that you accompany each persistent class with persistence metadata.
This metadata serves three primary purposes:
</para>
<orderedlist>
<listitem>
<para>
To identify persistent classes.
</para>
</listitem>
<listitem>
<para>
To override default JPA behavior.
</para>
</listitem>
<listitem>
<para>
To provide the JPA implementation with information that it cannot glean from
simply reflecting on the persistent class.
</para>
</listitem>
</orderedlist>
<para>
<indexterm>
<primary>
annotations
</primary>
</indexterm>
Persistence metadata is specified using either the Java annotations defined in
the <literal>javax.persistence</literal> package, XML mapping files, or a
mixture of both. In the latter case, XML declarations override conflicting
annotations. If you choose to use XML metadata, the XML files must be available
at development and runtime, and must be discoverable via either of two
strategies:
</para>
<orderedlist>
<listitem>
<para>
In a resource named <filename>orm.xml</filename> placed in a <filename>
META-INF</filename> directory within a directory in your classpath or within a
jar archive containing your persistent classes.
</para>
</listitem>
<listitem>
<para>
Declared in your <link linkend="jpa_overview_persistence_xml"><filename>
persistence.xml</filename></link> configuration file. In this case, each XML
metadata file must be listed in a <literal>mapping-file</literal> element whose
content is either a path to the given file or a resource location available to
the class' class loader.
</para>
</listitem>
</orderedlist>
<para>
We describe the standard metadata annotations and XML equivalents throughout
this chapter. The full schema for XML mapping files is available in
<xref linkend="jpa_overview_meta_xml"/>. JPA also standardizes relational
mapping metadata and named query metadata, which we discuss in
<xref linkend="jpa_overview_mapping"/> and
<xref linkend="jpa_overview_query_named"/> respectively.
</para>
<note>
<para>
OpenJPA defines many useful annotations beyond the standard set. See
<xref linkend="ref_guide_meta_jpa"/> and
<xref linkend="ref_guide_meta_ext"/>
in the Reference Guide for details. There are currently no XML equivalents for
these extension annotations.
</para>
</note>
<note>
<para>
Persistence metadata may be used to validate the contents of your entities prior to communicating
with the database. This differs from mapping meta data which is primarily used for schema generation.
For example if you indicate that a relationship is not optional (e.g. @Basic(optional=false)) OpenJPA
will validate that the variable in your entity is not null <emphasis>before</emphasis> inserting a row
in the database.
</para>
</note>
<mediaobject>
<imageobject>
<!-- PNG image data, 553 x 580 (see README) -->
<imagedata fileref="img/jpa-meta-model.png" width="369"/>
</imageobject>
</mediaobject>
<para>
Through the course of this chapter, we will create the persistent object model
above.
</para>
<section id="jpa_overview_meta_class">
<title>
Class Metadata
</title>
<para>
The following metadata annotations and XML elements apply to persistent class
declarations.
</para>
<section id="jpa_overview_meta_entity">
<title>
Entity
</title>
<indexterm zone="jpa_overview_meta_entity">
<primary>
Entity
</primary>
<secondary>
annotation
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_entity">
<primary>
metadata
</primary>
<secondary>
Entity
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_entity">
<primary>
annotations
</primary>
<secondary>
Entity
</secondary>
</indexterm>
<para>
The <classname>Entity</classname> annotation denotes an entity class. All entity
classes must have this annotation. The <classname>Entity</classname> annotation
takes one optional property:
</para>
<itemizedlist>
<listitem>
<para>
<literal>String name</literal>: Name used to refer to the entity in queries.
Must not be a reserved literal in JPQL. Defaults to the unqualified name of the
entity class.
</para>
</listitem>
</itemizedlist>
<para>
The equivalent XML element is <literal>entity</literal>. It has the following
attributes:
</para>
<itemizedlist>
<listitem>
<para>
<literal>class</literal>: The entity class. This attribute is required.
</para>
</listitem>
<listitem>
<para>
<literal>name</literal>: Named used to refer to the class in queries. See the
name property above.
</para>
</listitem>
<listitem>
<para>
<literal>access</literal>: The access type to use for the class. Must either be
<literal>FIELD</literal> or <literal>PROPERTY</literal>. For details on access
types, see <xref linkend="jpa_overview_meta_field"/>.
</para>
</listitem>
</itemizedlist>
<note>
<para>
OpenJPA uses a process called <emphasis>enhancement</emphasis> to modify the
bytecode of entities for transparent lazy loading and immediate dirty tracking.
See <xref linkend="ref_guide_pc_enhance"/> in the Reference Guide for
details on enhancement.
</para>
</note>
</section>
<section id="jpa_overview_meta_idclass">
<title>
Id Class
</title>
<indexterm zone="jpa_overview_meta_idclass">
<primary>
IdClass
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_idclass">
<primary>
metadata
</primary>
<secondary>
IdClass
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_idclass">
<primary>
annotations
</primary>
<secondary>
IdClass
</secondary>
</indexterm>
<para>
As we discussed in <xref linkend="jpa_overview_pc_identitycls"/>,
entities with multiple identity fields must use an <emphasis> identity class
</emphasis> to encapsulate their persistent identity. The <classname>IdClass
</classname> annotation specifies this class. It accepts a single <classname>
java.lang.Class</classname> value.
</para>
<para>
The equivalent XML element is <literal>id-class</literal>, which has a single
attribute:
</para>
<itemizedlist>
<listitem>
<para>
<literal>class</literal>: Set this required attribute to the name of the
identity class.
</para>
</listitem>
</itemizedlist>
</section>
<section id="jpa_overview_meta_embeddablesuper">
<title>
Mapped Superclass
</title>
<indexterm zone="jpa_overview_meta_embeddablesuper">
<primary>
MappedSuperclass
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_embeddablesuper">
<primary>
metadata
</primary>
<secondary>
MappedSuperclass
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_embeddablesuper">
<primary>
annotations
</primary>
<secondary>
MappedSuperclass
</secondary>
</indexterm>
<para>
A <emphasis>mapped superclass</emphasis> is a non-entity class that can define
persistent state and mapping information for entity subclasses. Mapped
superclasses are usually abstract. Unlike true entities, you cannot query a
mapped superclass, pass a mapped superclass instance to any <classname>
EntityManager</classname> or <classname>Query</classname> methods, or declare a
persistent relation with a mapped superclass target. You denote a mapped
superclass with the <classname>MappedSuperclass</classname> marker annotation.
</para>
<para>
The equivalent XML element is <literal>mapped-superclass</literal>. It expects
the following attributes:
</para>
<itemizedlist>
<listitem>
<para>
<literal>class</literal>: The entity class. This attribute is required.
</para>
</listitem>
<listitem>
<para>
<literal>access</literal>: The access type to use for the class. Must either be
<literal>FIELD</literal> or <literal>PROPERTY</literal>. For details on access
types, see <xref linkend="jpa_overview_meta_field"/>.
</para>
</listitem>
</itemizedlist>
<note>
<para>
OpenJPA allows you to query on mapped superclasses. A query on a mapped
superclass will return all matching subclass instances. OpenJPA also allows you
to declare relations to mapped superclass types; however, you cannot query
across these relations.
</para>
</note>
</section>
<section id="jpa_overview_meta_embeddable">
<title>
Embeddable
</title>
<indexterm zone="jpa_overview_meta_embeddable">
<primary>
Embeddable
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_embeddable">
<primary>
metadata
</primary>
<secondary>
Embeddable
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_embeddable">
<primary>
annotations
</primary>
<secondary>
Embeddable
</secondary>
</indexterm>
<para>
The <classname>Embeddable</classname> annotation designates an embeddable
persistent class. Embeddable instances are stored as part of the record of their
owning instance. All embeddable classes must have this annotation.
</para>
<para>
A persistent class can either be an entity or an embeddable class, but not both.
</para>
<para>
The equivalent XML element is <literal>embeddable</literal>. It understands the
following attributes:
</para>
<itemizedlist>
<listitem>
<para>
<literal>class</literal>: The entity class. This attribute is required.
</para>
</listitem>
<listitem>
<para>
<literal>access</literal>: The access type to use for the class. Must either be
<literal>FIELD</literal> or <literal>PROPERTY</literal>. For details on access
types, see <xref linkend="jpa_overview_meta_field"/>.
</para>
</listitem>
</itemizedlist>
<note>
<para>
OpenJPA allows a persistent class to be both an entity and an embeddable class.
Instances of the class will act as entities when persisted explicitly or assigned
to non-embedded fields of entities. Instances will act as embedded values when
assigned to embedded fields of entities.
</para>
<para>
To signal that a class is both an entity and an embeddable class in OpenJPA,
simply add both the <literal>@Entity</literal> and the <literal>@Embeddable
</literal> annotations to the class.
</para>
</note>
</section>
<section id="jpa_overview_meta_entity_listeners">
<title>
EntityListeners
</title>
<indexterm zone="jpa_overview_meta_entity_listeners">
<primary>
EntityListeners
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_entity_listeners">
<primary>
entity-listeners
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_entity_listeners">
<primary>
metadata
</primary>
<secondary>
EntityListeners
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_entity_listeners">
<primary>
annotations
</primary>
<secondary>
EntityListeners
</secondary>
</indexterm>
<para>
An entity may list its lifecycle event listeners in the <classname>
EntityListeners</classname> annotation. This value of this annotation is an
array of the listener <classname>Class</classname> es for the entity. The
equivalent XML element is <literal>entity-listeners</literal>. For more details
on entity listeners, see <xref linkend="jpa_overview_pc_callbacks"/>.
</para>
</section>
<section id="jpa_overview_meta_classex">
<title>
Example
</title>
<para>
Here are the class declarations for our persistent object model, annotated with
the appropriate persistence metadata. Note that <classname>Magazine</classname>
declares an identity class, and that <classname>Document</classname> and
<classname>Address</classname> are a mapped superclass and an embeddable class,
respectively. <classname>LifetimeSubscription</classname> and <classname>
TrialSubscription</classname> override the default entity name to supply a
shorter alias for use in queries.
</para>
<example id="jpa_overview_meta_classlisting">
<title>
Class Metadata
</title>
<programlisting>
package org.mag;
@Entity
@IdClass(Magazine.MagazineId.class)
public class Magazine {
...
public static class MagazineId {
...
}
}
@Entity
public class Article {
...
}
package org.mag.pub;
@Entity
public class Company {
...
}
@Entity
public class Author {
...
}
@Embeddable
public class Address {
...
}
package org.mag.subscribe;
@MappedSuperclass
public abstract class Document {
...
}
@Entity
public class Contract
extends Document {
...
}
@Entity
public class Subscription {
...
@Entity
public static class LineItem
extends Contract {
...
}
}
@Entity(name="Lifetime")
public class LifetimeSubscription
extends Subscription {
...
}
@Entity(name="Trial")
public class TrialSubscription
extends Subscription {
...
}
</programlisting>
<para>
The equivalent declarations in XML:
</para>
<programlisting>
&lt;entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
version="1.0"&gt;
&lt;mapped-superclass class="org.mag.subscribe.Document"&gt;
...
&lt;/mapped-superclass&gt;
&lt;entity class="org.mag.Magazine"&gt;
&lt;id-class class="org.mag.Magazine$MagazineId"/&gt;
...
&lt;/entity&gt;
&lt;entity class="org.mag.Article"&gt;
...
&lt;/entity&gt;
&lt;entity class="org.mag.pub.Company"&gt;
...
&lt;/entity&gt;
&lt;entity class="org.mag.pub.Author"&gt;
...
&lt;/entity&gt;
&lt;entity class="org.mag.subscribe.Contract"&gt;
...
&lt;/entity&gt;
&lt;entity class="org.mag.subscribe.LineItem"&gt;
...
&lt;/entity&gt;
&lt;entity class="org.mag.subscribe.LifetimeSubscription" name="Lifetime"&gt;
...
&lt;/entity&gt;
&lt;entity class="org.mag.subscribe.TrialSubscription" name="Trial"&gt;
...
&lt;/entity&gt;
&lt;embeddable class="org.mag.pub.Address"&gt;
...
&lt;/embeddable&gt;
&lt;/entity-mappings&gt;
</programlisting>
</example>
</section>
</section>
<section id="jpa_overview_meta_field">
<title>
Field and Property Metadata
</title>
<para>
The persistence implementation must be able to retrieve and set the persistent
state of your entities, mapped superclasses, and embeddable types. JPA offers
two modes of persistent state access: <emphasis>field access</emphasis>, and
<emphasis>property access</emphasis>. The access type of a persistent attribute
can be either set explicitly on a class or attribute level, inherited, or
determined by the provider.
</para>
<para>
Under field access, the implementation injects state directly into your
persistent fields, and retrieves changed state from your fields as well. To
declare field access on an entire entity with XML metadata, set the
<literal>access</literal> attribute of your <literal>entity</literal> XML
element to <literal>FIELD</literal>. To use field access for an entire entity
using annotation metadata, simply place your metadata and mapping annotations
on your field declarations:
</para>
<programlisting>
@ManyToOne
private Company publisher;
</programlisting>
<para>
<indexterm>
<primary>
metadata
</primary>
<secondary>
property access
</secondary>
</indexterm>
<indexterm>
<primary>
persistent classes
</primary>
<secondary>
property access
</secondary>
</indexterm>
<indexterm>
<primary>
persistent properties
</primary>
<seealso>
persistent fields
</seealso>
</indexterm>
Property access, on the other hand, retrieves and loads state through JavaBean
"getter" and "setter" methods. For a property <literal>p</literal> of type
<literal>T</literal>, you must define the following getter method:
</para>
<programlisting>
T getP();
</programlisting>
<para>
For boolean properties, this is also acceptable:
</para>
<programlisting>
boolean isP();
</programlisting>
<para>
You must also define the following setter method:
</para>
<programlisting>
void setP(T value);
</programlisting>
<para>
To implicitly use property access for an entire class by default, set your
<literal>entity</literal> element's <literal> access</literal> attribute to
<literal>PROPERTY</literal>, or place your metadata and mapping annotations on
the getter method:
</para>
<programlisting>
@ManyToOne
private Company getPublisher() { ... }
private void setPublisher(Company publisher) { ... }
</programlisting>
<section id="jpa_overview_explicit_access">
<title>
Explicit Access
</title>
<para>
<indexterm>
<primary>
metadata
</primary>
<secondary>
explicit access
</secondary>
</indexterm>
<indexterm>
<primary>
persistent classes
</primary>
<secondary>
explicit access
</secondary>
</indexterm>
<indexterm>
<primary>
persistent attributes
</primary>
<seealso>
persistent fields
</seealso>
<seealso>
persistent properties
</seealso>
</indexterm>
The access type of a class or individual persistent attributes can be specified
explicitly using the <literal>@Access</literal> annotation or <literal>access
</literal> attribute on the XML elements used to define persistent attributes.
When explicitly defining access, specify the explicit access type for the class
and then apply the <literal>@Access</literal> annotation or <literal>access
</literal>XML attribute to individual fields or properties. If explicit
<literal>FIELD</literal> or <literal>PROPERTY</literal> is specified at the
class level, all eligible non-transient fields or properties will be persistent.
If using class level <literal>FIELD</literal> access, non-persistent fields must
be <literal>transient</literal> or annotated with <literal>@Transient</literal>.
If using class level <literal>PROPERTY</literal> access, non-persistent
properties must be annotated <literal>@Transient</literal> or excluded using
the <literal>transient</literal> XML attribute. Refer to the JPA specification
for specific rules regarding the use of explicit access with embeddables and
within an inheritance hierarchy.
</para>
<para>
This entity definitions shows how multiple access types may be specified
on an entity:
</para>
<programlisting>
@Entity
@Access(AccessType.FIELD)
public class PaymentContract {
@Id
private String id;
@Temporal(TemporalType.DATE)
private String contractDate;
@Transient
private String terms;
@Version
private int version;
@Lob
@Access(AccessType.PROPERTY)
public String getContractTerms() {
return terms;
}
public void setContractTerms(String terms) {
// Format string before persisting
this.terms = formatTerms(terms);
}
...
}
</programlisting>
<para>
The equivalent declarations in XML:
</para>
<programlisting>
&lt;entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
version="2.0"&gt;
&lt;entity class="org.xyz.PaymentContract" access="FIELD"&gt;
&lt;attributes&gt;
&lt;id name="id"/&gt;
&lt;basic name="contractTerms" access="PROPERTY"&gt;
&lt;lob/&gt;
&lt;/basic&gt;
&lt;basic name="contractDate"&gt;
&lt;temporal>DATE&lt;/temporal&gt;
&lt;/basic>
&lt;version name="version"/&gt;
&lt;transient name="terms"/&gt;
&lt;/attributes&gt;
&lt;/entity&gt;
&lt;/entity-mappings&gt;
</programlisting>
</section>
<warning>
<para>
When using property access, only the getter and setter method for a property
should ever access the underlying persistent field directly. Other methods,
including internal business methods in the persistent class, should go through
the getter and setter methods when manipulating persistent state.
</para>
<para>
Also, take care when adding business logic to your getter and setter methods.
Consider that they are invoked by the persistence implementation to load and
retrieve all persistent state; other side effects might not be desirable.
</para>
</warning>
<para>
The remainder of this document uses the term "persistent field" to refer to
either a persistent field or a persistent property.
</para>
<section id="jpa_overview_meta_transient">
<title>
Transient
</title>
<indexterm zone="jpa_overview_meta_transient">
<primary>
Transient
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_transient">
<primary>
metadata
</primary>
<secondary>
Transient
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_transient">
<primary>
annotations
</primary>
<secondary>
Transient
</secondary>
</indexterm>
<para>
The <classname>Transient</classname> annotation specifies that a field is
non-persistent. Use it to exclude fields from management that would otherwise be
persistent. <classname>Transient</classname> is a marker annotation only; it
has no properties.
</para>
<para>
The equivalent XML element is <literal>transient</literal>. It has a single
attribute:
</para>
<itemizedlist>
<listitem>
<para>
<literal>name</literal>: The transient field or property name. This attribute
is required.
</para>
</listitem>
</itemizedlist>
</section>
<section id="jpa_overview_meta_id">
<title>
Id
</title>
<indexterm zone="jpa_overview_meta_id">
<primary>
Id
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_id">
<primary>
metadata
</primary>
<secondary>
Id
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_id">
<primary>
annotations
</primary>
<secondary>
Id
</secondary>
</indexterm>
<para>
Annotate your simple identity fields with <classname>Id</classname>. This
annotation has no properties. We explore entity identity and identity fields in
<xref linkend="jpa_overview_pc_id"/>.
</para>
<para>
The equivalent XML element is <literal>id</literal>. It has one required
attribute:
</para>
<itemizedlist>
<listitem>
<para>
<literal>name</literal>: The name of the identity field or property.
</para>
</listitem>
</itemizedlist>
</section>
<section id="jpa_overview_meta_gen">
<title>
Generated Value
</title>
<indexterm zone="jpa_overview_meta_gen">
<primary>
GeneratedValue
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_gen">
<primary>
metadata
</primary>
<secondary>
GeneratedValue
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_gen">
<primary>
annotations
</primary>
<secondary>
GeneratedValue
</secondary>
</indexterm>
<para>
The previous section showed you how to declare your identity fields with the
<classname>Id</classname> annotation. It is often convenient to allow the
persistence implementation to assign a unique value to your identity fields
automatically. JPA includes the <classname>GeneratedValue</classname>
annotation for this purpose. It has the following properties:
</para>
<itemizedlist>
<listitem>
<para>
<literal>GenerationType strategy</literal>: Enum value specifying how to
auto-generate the field value. The <classname>GenerationType</classname> enum
has the following values:
</para>
<itemizedlist>
<listitem>
<para>
<literal>GeneratorType.AUTO</literal>: The default. Assign the field a
generated value, leaving the details to the JPA vendor.
</para>
</listitem>
<listitem>
<para>
<literal>GenerationType.IDENTITY</literal>: The database will assign an
identity value on insert.
</para>
</listitem>
<listitem>
<para>
<literal>GenerationType.SEQUENCE</literal>: Use a datastore sequence to
generate a field value.
</para>
</listitem>
<listitem>
<para>
<literal>GenerationType.TABLE</literal>: Use a sequence table to generate a
field value.
</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>
<literal>String generator</literal>: The name of a generator defined in mapping
metadata. We show you how to define named generators in
<xref linkend="jpa_overview_mapping_sequence"/>. If the <classname>
GenerationType</classname> is set but this property is unset, the JPA
implementation uses appropriate defaults for the selected generation type.
</para>
</listitem>
</itemizedlist>
<para>
The equivalent XML element is <literal>generated-value</literal>, which
includes the following attributes:
</para>
<itemizedlist>
<listitem>
<para>
<literal>strategy</literal>: One of <literal> TABLE</literal>, <literal>
SEQUENCE</literal>, <literal> IDENTITY</literal>, or <literal>AUTO</literal>,
defaulting to <literal>AUTO</literal>.
</para>
</listitem>
<listitem>
<para>
<literal>generator</literal>: Equivalent to the generator property listed
above.
</para>
</listitem>
</itemizedlist>
<note>
<para>
OpenJPA allows you to use the <classname>GeneratedValue</classname> annotation
on any field, not just identity fields. Before using the <literal>IDENTITY
</literal> generation strategy, however, read
<xref linkend="ref_guide_pc_oid_pkgen_autoinc"/> in the Reference Guide.
</para>
<para>
OpenJPA also offers additional generator strategies for non-numeric fields,
which you can access by setting <literal>strategy</literal> to <literal>AUTO
</literal> (the default), and setting the <literal>generator</literal> string
to:
</para>
<itemizedlist>
<listitem>
<para>
<indexterm>
<primary>
mapping metadata
</primary>
<secondary>
uuid-string
</secondary>
</indexterm>
<indexterm>
<primary>
uuid-string
</primary>
</indexterm>
<literal>uuid-string</literal>: OpenJPA will generate a 128-bit type 1 UUID
unique within the network, represented as a 16-character string. For more
information on UUIDs, see the IETF UUID draft specification at:
<ulink url="http://www.ics.uci.edu/~ejw/authoring/uuid-guid/">
http://www.ics.uci.edu/~ejw/authoring/uuid-guid/</ulink>
</para>
</listitem>
<listitem>
<para>
<indexterm>
<primary>
mapping metadata
</primary>
<secondary>
uuid-hex
</secondary>
</indexterm>
<indexterm>
<primary>
uuid-hex
</primary>
</indexterm>
<literal>uuid-hex</literal>: Same as <literal> uuid-string</literal>, but
represents the type 1 UUID as a 32-character hexadecimal string.
</para>
</listitem>
<listitem>
<para>
<indexterm>
<primary>
mapping metadata
</primary>
<secondary>
uuid-type4-string
</secondary>
</indexterm>
<indexterm>
<primary>
uuid-type4-string
</primary>
</indexterm>
<literal>uuid-type4-string</literal>: OpenJPA will generate a 128-bit type 4
pseudo-random UUID, represented as a 16-character string. For more
information on UUIDs, see the IETF UUID draft specification at:
<ulink url="http://www.ics.uci.edu/~ejw/authoring/uuid-guid/">
http://www.ics.uci.edu/~ejw/authoring/uuid-guid/</ulink>
</para>
</listitem>
<listitem>
<para>
<indexterm>
<primary>
mapping metadata
</primary>
<secondary>
uuid-type4-hex
</secondary>
</indexterm>
<indexterm>
<primary>
uuid-type4-hex
</primary>
</indexterm>
<literal>uuid-type4-hex</literal>: Same as <literal> uuid-type4-string</literal>
, but represents the type 4 UUID as a 32-character hexadecimal string.
</para>
</listitem>
</itemizedlist>
<para>
These string constants are defined in
<ulink url="../../apidocs/org/apache/openjpa/persistence/Generator.html">
<classname>org.apache.openjpa.persistence.Generator</classname></ulink>.
</para>
<para>
If the entities are mapped to the same table name but with different schema
name within one <literal>PersistenceUnit</literal> intentionally, and the
strategy of <literal>GeneratedType.AUTO</literal> is used to generate the ID
for each entity, a schema name for each entity must be explicitly declared
either through the annotation or the mapping.xml file. Otherwise, the mapping
tool only creates the tables for those entities with the schema names under
each schema. In addition, there will be only one
<literal>OPENJPA_SEQUENCE_TABLE</literal> created for all the entities within
the <literal>PersistenceUnit</literal> if the entities are not identified
with the schema name. Read <xref linkend="ref_guide_sequence"/> and
<xref linkend="ref_guide_schema_def"/> in the Reference Guide.
</para>
</note>
</section>
<section id="jpa_overview_meta_embedid">
<title>
Embedded Id
</title>
<indexterm zone="jpa_overview_meta_embedid">
<primary>
EmbeddedId
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_embedid">
<primary>
metadata
</primary>
<secondary>
EmbeddedId
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_embedid">
<primary>
annotations
</primary>
<secondary>
EmbeddedId
</secondary>
</indexterm>
<para>
If your entity has multiple identity values, you may declare multiple <literal>
@Id</literal> fields, or you may declare a single <literal>@EmbeddedId</literal>
field. The type of a field annotated with <classname>EmbeddedId</classname> must
be an embeddable entity class. The fields of this embeddable class are
considered the identity values of the owning entity. We explore entity identity
and identity fields in <xref linkend="jpa_overview_pc_id"/>.
</para>
<para>
The <classname>EmbeddedId</classname> annotation has no properties.
</para>
<para>
The equivalent XML element is <literal>embedded-id</literal>. It has one
required attribute:
</para>
<itemizedlist>
<listitem>
<para>
<literal>name</literal>: The name of the identity field or property.
</para>
</listitem>
</itemizedlist>
</section>
<section id="jpa_overview_meta_version">
<title>
Version
</title>
<indexterm zone="jpa_overview_meta_version">
<primary>
Version
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_version">
<primary>
metadata
</primary>
<secondary>
Version
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_version">
<primary>
annotations
</primary>
<secondary>
Version
</secondary>
</indexterm>
<para>
Use the <classname>Version</classname> annotation to designate a version field.
<xref linkend="jpa_overview_pc_version"/> explained the importance of
version fields to JPA. This is a marker annotation; it has no properties.
</para>
<para>
The equivalent XML element is <literal>version</literal>, which has a single
attribute:
</para>
<itemizedlist>
<listitem>
<para>
<literal>name</literal>: The name of the version field or property. This
attribute is required.
</para>
</listitem>
</itemizedlist>
</section>
<section id="jpa_overview_meta_basic">
<title>
Basic
</title>
<indexterm zone="jpa_overview_meta_basic">
<primary>
Basic
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_basic">
<primary>
metadata
</primary>
<secondary>
Basic
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_basic">
<primary>
annotations
</primary>
<secondary>
Basic
</secondary>
</indexterm>
<para>
<classname>Basic</classname> signifies a standard value persisted as-is to the
datastore. You can use the <classname>Basic</classname> annotation on persistent
fields of the following types: primitives, primitive wrappers, <classname>
java.lang.String</classname>, <classname>byte[]</classname>, <classname>
Byte[]</classname>, <classname>char[]</classname>, <classname>
Character[]</classname>, <classname>java.math.BigDecimal</classname>,
<classname>java.math.BigInteger</classname>, <classname>
java.util.Date</classname>, <classname>java.util.Calendar</classname>,
<classname>java.sql.Date</classname>, <classname>java.sql.Timestamp</classname>,
<classname>java.sql.Time</classname>,
<classname>Enum</classname>s, and <classname>Serializable</classname> types.
</para>
<para>
Since JPA 2.2 the following <classname>java.time</classname> Types are also supported:
<classname>java.time.LocalDate</classname>, <classname>java.time.LocalDateTime</classname>,
<classname>java.time.LocalTime</classname>, <classname>java.time.LocalOffsetTime</classname>
and <classname>java.time.OffsetDateTime</classname>.
</para>
<para>
<classname>Basic</classname> declares these properties:
</para>
<itemizedlist>
<listitem>
<para>
<literal>FetchType fetch</literal>: Whether to load the field eagerly
(<literal>FetchType.EAGER</literal>) or lazily (<literal>
FetchType.LAZY</literal>). Defaults to <literal>FetchType.EAGER</literal>.
</para>
</listitem>
<listitem>
<para>
<literal>boolean optional</literal>: Whether the datastore allows null values.
Defaults to true.
</para>
</listitem>
</itemizedlist>
<para>
The equivalent XML element is <literal>basic</literal>. It has the following
attributes:
</para>
<itemizedlist>
<listitem>
<para>
<literal>name</literal>: The name of the field or property. This attribute is
required.
</para>
</listitem>
<listitem>
<para>
<literal>fetch</literal>: One of <literal>EAGER</literal> or <literal>LAZY
</literal>.
</para>
</listitem>
<listitem>
<para>
<literal>optional</literal>: Boolean indicating whether the field value may be
null.
</para>
</listitem>
</itemizedlist>
<section id="jpa_overview_meta_fetch">
<title>
Fetch Type
</title>
<indexterm zone="jpa_overview_meta_fetch">
<primary>
eager fetching
</primary>
<secondary>
FetchType
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_fetch">
<primary>
FetchType
</primary>
<seealso>
eager fetching
</seealso>
</indexterm>
<indexterm zone="jpa_overview_meta_fetch">
<primary>
metadata
</primary>
<secondary>
FetchType
</secondary>
</indexterm>
<para>
Many metadata annotations in JPA have a <literal>fetch</literal> property. This
property can take on one of two values: <literal>FetchType.EAGER</literal> or
<literal>FetchType.LAZY</literal>. <literal>FetchType.EAGER</literal> means that
the field is loaded by the JPA implementation before it returns the persistent
object to you. Whenever you retrieve an entity from a query or from the
<classname>EntityManager</classname>, you are guaranteed that all of its eager
fields are populated with datastore data.
</para>
<para>
<literal>FetchType.LAZY</literal> is a hint to the JPA runtime that you want to
defer loading of the field until you access it. This is called <emphasis>lazy
loading</emphasis>. Lazy loading is completely transparent; when you attempt to
read the field for the first time, the JPA runtime will load the value from the
datastore and populate the field automatically. Lazy loading is only a hint and
not a directive because some JPA implementations cannot lazy-load certain field
types.
</para>
<para>
With a mix of eager and lazily-loaded fields, you can ensure that commonly-used
fields load efficiently, and that other state loads transparently when accessed.
As you will see in <xref linkend="jpa_overview_emfactory_perscontext"/>,
you can also use eager fetching to ensure that entities have all needed data
loaded before they become <emphasis>detached</emphasis> at the end of a
persistence context.
</para>
<note>
<para>
OpenJPA can lazy-load any field type. OpenJPA also allows you to dynamically
change which fields are eagerly or lazily loaded at runtime. See
<xref linkend="ref_guide_fetch"/> in the Reference Guide for details.
</para>
<para>
The Reference Guide details OpenJPA's eager fetching behavior in
<xref linkend="ref_guide_perfpack_eager"/>.
</para>
</note>
</section>
</section>
<section id="jpa_overview_meta_embedded">
<title>
Embedded
</title>
<indexterm zone="jpa_overview_meta_embedded">
<primary>
Embedded
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_embedded">
<primary>
metadata
</primary>
<secondary>
Embedded
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_embedded">
<primary>
annotations
</primary>
<secondary>
Embedded
</secondary>
</indexterm>
<para>
Use the <classname>Embedded</classname> marker annotation on embeddable field
types. Embedded fields are mapped as part of the datastore record of the
declaring entity. In our sample model, <classname>Author</classname> and
<classname>Company</classname> each embed their <classname>Address</classname>,
rather than forming a relation to an <classname>Address</classname> as a
separate entity.
</para>
<para>
The equivalent XML element is <literal>embedded</literal>, which expects a
single attribute:
</para>
<itemizedlist>
<listitem>
<para>
<literal>name</literal>: The name of the field or property. This attribute is
required.
</para>
</listitem>
</itemizedlist>
</section>
<section id="jpa_overview_meta_manytoone">
<title>
Many To One
</title>
<indexterm zone="jpa_overview_meta_manytoone">
<primary>
ManyToOne
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_manytoone">
<primary>
metadata
</primary>
<secondary>
ManyToOne
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_manytoone">
<primary>
annotations
</primary>
<secondary>
ManyToOne
</secondary>
</indexterm>
<para>
When an entity <literal>A</literal> references a single entity <literal>
B</literal>, and other <literal>A</literal>s might also reference the same
<literal>B</literal>, we say there is a <emphasis>many to one</emphasis>
relation from <literal>A</literal> to <literal>B</literal>. In our sample
model, for example, each magazine has a reference to its publisher. Multiple
magazines might have the same publisher. We say, then, that the <literal>
Magazine.publisher</literal> field is a many to one relation from magazines to
publishers.
</para>
<para>
JPA indicates many to one relations between entities with the <classname>
ManyToOne</classname> annotation. This annotation has the following properties:
</para>
<itemizedlist>
<listitem>
<para>
<literal>Class targetEntity</literal>: The class of the related entity type.
</para>
</listitem>
<listitem>
<para>
<literal>CascadeType[] cascade</literal>: Array of enum values defining cascade
behavior for this field. We explore cascades below. Defaults to an empty array.
</para>
</listitem>
<listitem>
<para>
<literal>FetchType fetch</literal>: Whether to load the field eagerly
(<literal>FetchType.EAGER</literal>) or lazily
(<literal>FetchType.LAZY</literal>). Defaults to <literal>
FetchType.EAGER</literal>. See <xref linkend="jpa_overview_meta_fetch"/> above
for details on fetch types.
</para>
</listitem>
<listitem>
<para>
<literal>boolean optional</literal>: Whether the related object must exist. If
<literal>false</literal>, this field cannot be null. Defaults to <literal>
true</literal>.
</para>
</listitem>
</itemizedlist>
<para>
The equivalent XML element is <literal>many-to-one</literal>. It accepts the
following attributes:
</para>
<itemizedlist>
<listitem>
<para>
<literal>name</literal>: The name of the field or property. This attribute is
required.
</para>
</listitem>
<listitem>
<para>
<literal>target-entity</literal>: The class of the related type.
</para>
</listitem>
<listitem>
<para>
<literal>fetch</literal>: One of <literal>EAGER</literal> or <literal>
LAZY</literal>.
</para>
</listitem>
<listitem>
<para>
<literal>optional</literal>: Boolean indicating whether the field value may be
null.
</para>
</listitem>
</itemizedlist>
<section id="jpa_overview_meta_cascade">
<title>
Cascade Type
</title>
<indexterm zone="jpa_overview_meta_cascade">
<primary>
CascadeType
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_cascade">
<primary>
metadata
</primary>
<secondary>
CascadeType
</secondary>
</indexterm>
<para>
We introduce the JPA <classname>EntityManager</classname> in
<xref linkend="jpa_overview_em"/>. The <classname>EntityManager
</classname> has APIs to persist new entities, remove (delete) existing
entities, refresh entity state from the datastore, and merge <emphasis>detached
</emphasis> entity state back into the persistence context. We explore all of
these APIs in detail later in the overview.
</para>
<para>
When the <classname>EntityManager</classname> is performing the above
operations, you can instruct it to automatically cascade the operation to the
entities held in a persistent field with the <literal>cascade</literal> property
of your metadata annotation. This process is recursive. The <literal>cascade
</literal> property accepts an array of <classname>CascadeType</classname> enum
values.
</para>
<itemizedlist>
<listitem>
<para>
<literal>CascadeType.PERSIST</literal>: When persisting an entity, also persist
the entities held in this field. We suggest liberal application of this cascade
rule, because if the <classname>EntityManager</classname> finds a field that
references a new entity during flush, and the field does not use <literal>
CascadeType.PERSIST</literal>, it is an error.
</para>
</listitem>
<listitem>
<para>
<literal>CascadeType.REMOVE</literal>: When deleting an entity, also delete the
entities held in this field.
</para>
</listitem>
<listitem>
<para>
<literal>CascadeType.REFRESH</literal>: When refreshing an entity, also refresh
the entities held in this field.
</para>
</listitem>
<listitem>
<para>
<literal>CascadeType.MERGE</literal>: When merging entity state, also merge the
entities held in this field.
</para>
</listitem>
</itemizedlist>
<note>
<para>
OpenJPA offers enhancements to JPA's CascadeType.REMOVE functionality,
including additional annotations to control how and when dependent fields will
be removed. See <xref linkend="dependent"/> for more details.
</para>
</note>
<para>
<classname>CascadeType</classname> defines one additional value, <literal>
CascadeType.ALL</literal>, that acts as a shortcut for all of the values above.
The following annotations are equivalent:
</para>
<programlisting>
@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.REMOVE,
CascadeType.REFRESH,CascadeType.MERGE})
private Company publisher;
</programlisting>
<programlisting>
@ManyToOne(cascade=CascadeType.ALL)
private Company publisher;
</programlisting>
<para>
In XML, these enumeration constants are available as child elements of the
<literal>cascade</literal> element. The <literal>cascade</literal> element is
itself a child of <literal>many-to-one</literal>. The following examples are
equivalent:
</para>
<programlisting>
&lt;many-to-one name="publisher"&gt;
&lt;cascade&gt;
&lt;cascade-persist/&gt;
&lt;cascade-merge/&gt;
&lt;cascade-remove/&gt;
&lt;cascade-refresh/&gt;
&lt;/cascade&gt;
&lt;/many-to-one&gt;
</programlisting>
<programlisting>
&lt;many-to-one name="publisher"&gt;
&lt;cascade&gt;
&lt;cascade-all/&gt;
&lt;/cascade&gt;
&lt;/many-to-one&gt;
</programlisting>
</section>
</section>
<section id="jpa_overview_meta_onetomany">
<title>
One To Many
</title>
<indexterm zone="jpa_overview_meta_onetomany">
<primary>
OneToMany
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_onetomany">
<primary>
metadata
</primary>
<secondary>
OneToMany
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_onetomany">
<primary>
annotations
</primary>
<secondary>
OneToMany
</secondary>
</indexterm>
<para>
When an entity <literal>A</literal> references multiple <literal>B</literal>
entities, and no two <literal>A</literal>s reference the same <literal>
B</literal>, we say there is a <emphasis>one to many</emphasis> relation from
<literal>A</literal> to <literal>B</literal>.
</para>
<para>
One to many relations are the exact inverse of the many to one relations we
detailed in the preceding section. In that section, we said that the <literal>
Magazine.publisher</literal> field is a many to one relation from magazines to
publishers. Now, we see that the <literal>Company.mags</literal> field is the
inverse - a one to many relation from publishers to magazines. Each company may
publish multiple magazines, but each magazine can have only one publisher.
</para>
<para>
JPA indicates one to many relations between entities with the <classname>
OneToMany</classname> annotation. This annotation has the following properties:
</para>
<itemizedlist>
<listitem>
<para>
<literal>Class targetEntity</literal>: The class of the related entity type.
This information is usually taken from the parameterized collection or map
element type. You must supply it explicitly, however, if your field isn't a
parameterized type.
</para>
</listitem>
<listitem>
<para>
<literal>String mappedBy</literal>: Names the many to one field in the related
entity that maps this bidirectional relation. We explain bidirectional relations
below. Leaving this property unset signals that this is a standard
unidirectional relation.
</para>
</listitem>
<listitem>
<para>
<literal>CascadeType[] cascade</literal>: Array of enum values defining cascade
behavior for the collection elements. We explore cascades above in
<xref linkend="jpa_overview_meta_cascade"/>. Defaults to an empty array.
</para>
</listitem>
<listitem>
<para>
<literal>FetchType fetch</literal>: Whether to load the field eagerly
(<literal>FetchType.EAGER</literal>) or lazily
(<literal>FetchType.LAZY</literal>). Defaults to <literal>
FetchType.LAZY</literal>. See <xref linkend="jpa_overview_meta_fetch"/> above
for details on fetch types.
</para>
</listitem>
</itemizedlist>
<para>
The equivalent XML element is <literal>one-to-many</literal>, which includes
the following attributes:
</para>
<itemizedlist>
<listitem>
<para>
<literal>name</literal>: The name of the field or property. This attribute is
required.
</para>
</listitem>
<listitem>
<para>
<literal>target-entity</literal>: The class of the related type.
</para>
</listitem>
<listitem>
<para>
<literal>fetch</literal>: One of <literal>EAGER</literal> or <literal>
LAZY</literal>.
</para>
</listitem>
<listitem>
<para>
<literal>mapped-by</literal>: The name of the field or property that owns the
relation. See <xref linkend="jpa_overview_meta_field"/>.
</para>
</listitem>
</itemizedlist>
<para>
You may also nest the <literal>cascade</literal> element within a <literal>
one-to-many</literal> element.
</para>
<section id="jpa_overview_meta_mappedby">
<title>
Bidirectional Relations
</title>
<indexterm zone="jpa_overview_meta_mappedby">
<primary>
bidirectional relations
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_mappedby">
<primary>
mappedBy
</primary>
<seealso>
mapping metadata
</seealso>
</indexterm>
<indexterm zone="jpa_overview_meta_mappedby">
<primary>
mapping metadata
</primary>
<seealso>
mappedBy property
</seealso>
</indexterm>
<para>
When two fields are logical inverses of each other, they form a <emphasis>
bidirectional relation</emphasis>. Our model contains two bidirectional
relations: <literal>Magazine.publisher</literal> and <literal>Company.mags
</literal> form one bidirectional relation, and <literal>Article.authors
</literal> and <literal>Author.articles</literal> form the other. In both cases,
there is a clear link between the two fields that form the relationship. A
magazine refers to its publisher while the publisher refers to all its published
magazines. An article refers to its authors while each author refers to her
written articles.
</para>
<para>
When the two fields of a bidirectional relation share the same datastore
mapping, JPA formalizes the connection with the <literal>mappedBy</literal>
property. Marking <literal>Company.mags</literal> as <literal>mappedBy</literal>
<literal>Magazine.publisher</literal> means two things:
</para>
<orderedlist>
<listitem>
<para>
<literal>Company.mags</literal> uses the datastore mapping for <literal>
Magazine.publisher</literal>, but inverses it. In fact, it is illegal to
specify any additional mapping information when you use the <literal>mappedBy
</literal> property. All mapping information is read from the referenced field.
We explore mapping in depth in <xref linkend="jpa_overview_mapping"/>.
</para>
</listitem>
<listitem>
<para>
<literal>Magazine.publisher</literal> is the "owner" of the relation. The field
that specifies the mapping data is always the owner. This means that changes to
the <literal>Magazine.publisher</literal> field are reflected in the datastore,
while changes to the <literal>Company.mags</literal> field alone are not.
Changes to <literal>Company.mags</literal> may still affect the JPA
implementation's cache, however. Thus, it is very important that you keep your
object model consistent by properly maintaining both sides of your bidirectional
relations at all times.
</para>
</listitem>
</orderedlist>
<para>
You should always take advantage of the <literal>mappedBy</literal> property
rather than mapping each field of a bidirectional relation independently.
Failing to do so may result in the JPA implementation trying to update the
database with conflicting data. Be careful to only mark one side of the relation
as <literal>mappedBy</literal>, however. One side has to actually do the
mapping!
</para>
<note>
<para>
You can configure OpenJPA to automatically synchronize both sides of a
bidirectional relation, or to perform various actions when it detects
inconsistent relations. See <xref linkend="ref_guide_inverses"/> in the
Reference Guide for details.
</para>
</note>
</section>
</section>
<section id="jpa_overview_meta_onetoone">
<title>
One To One
</title>
<indexterm zone="jpa_overview_meta_onetoone">
<primary>
OneToOne
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_onetoone">
<primary>
metadata
</primary>
<secondary>
OneToOne
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_onetoone">
<primary>
annotations
</primary>
<secondary>
OneToOne
</secondary>
</indexterm>
<para>
When an entity <literal>A</literal> references a single entity <literal>
B</literal>, and no other <literal>A</literal>s can reference the same <literal>
B</literal>, we say there is a <emphasis>one to one</emphasis> relation between
<literal>A</literal> and <literal>B</literal>. In our sample model, <classname>
Magazine</classname> has a one to one relation to <classname>Article</classname>
through the <literal>Magazine.coverArticle</literal> field. No two magazines can
have the same cover article.
</para>
<para>
JPA indicates one to one relations between entities with the <classname>
OneToOne</classname> annotation. This annotation has the following properties:
</para>
<itemizedlist>
<listitem>
<para>
<literal>Class targetEntity</literal>: The class of the related entity type.
This information is usually taken from the field type.
</para>
</listitem>
<listitem>
<para>
<literal>String mappedBy</literal>: Names the field in the related entity that
maps this bidirectional relation. We explain bidirectional relations in
<xref linkend="jpa_overview_meta_mappedby"/> above. Leaving this property
unset signals that this is a standard unidirectional relation.
</para>
</listitem>
<listitem>
<para>
<literal>CascadeType[] cascade</literal>: Array of enum values defining cascade
behavior for this field. We explore cascades in
<xref linkend="jpa_overview_meta_cascade"/> above. Defaults to an empty
array.
</para>
</listitem>
<listitem>
<para>
<literal>FetchType fetch</literal>: Whether to load the field eagerly
(<literal>FetchType.EAGER</literal>) or lazily
(<literal>FetchType.LAZY</literal>). Defaults to <literal>
FetchType.EAGER</literal>. See <xref linkend="jpa_overview_meta_fetch"/> above
for details on fetch types.
</para>
</listitem>
<listitem>
<para>
<literal>boolean optional</literal>: Whether the related object must exist. If
<literal>false</literal>, this field cannot be null. Defaults to <literal>
true</literal>.
</para>
</listitem>
</itemizedlist>
<para>
The equivalent XML element is <literal>one-to-one</literal> which understands
the following attributes:
</para>
<itemizedlist>
<listitem>
<para>
<literal>name</literal>: The name of the field or property. This attribute is
required.
</para>
</listitem>
<listitem>
<para>
<literal>target-entity</literal>: The class of the related type.
</para>
</listitem>
<listitem>
<para>
<literal>fetch</literal>: One of <literal>EAGER</literal> or <literal>
LAZY</literal>.
</para>
</listitem>
<listitem>
<para>
<literal>mapped-by</literal>: The field that owns the relation. See
<xref linkend="jpa_overview_meta_field"/>.
</para>
</listitem>
</itemizedlist>
<para>
You may also nest the <literal>cascade</literal> element within a <literal>
one-to-one</literal> element.
</para>
</section>
<section id="jpa_overview_meta_manytomany">
<title>
Many To Many
</title>
<indexterm zone="jpa_overview_meta_manytomany">
<primary>
ManyToMany
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_manytomany">
<primary>
metadata
</primary>
<secondary>
ManyToMany
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_manytomany">
<primary>
annotations
</primary>
<secondary>
ManyToMany
</secondary>
</indexterm>
<para>
When an entity <literal>A</literal> references multiple <literal>B</literal>
entities, and other <literal>A</literal>s might reference some of the same
<literal>B</literal>s, we say there is a <emphasis>many to many</emphasis>
relation between <literal>A</literal> and <literal>B</literal>. In our sample
model, for example, each article has a reference to all the authors that
contributed to the article. Other articles might have some of the same authors.
We say, then, that <classname>Article</classname> and <classname>Author
</classname> have a many to many relation through the <literal>Article.authors
</literal> field.
</para>
<para>
JPA indicates many to many relations between entities with the <classname>
ManyToMany</classname> annotation. This annotation has the following properties:
</para>
<itemizedlist>
<listitem>
<para>
<literal>Class targetEntity</literal>: The class of the related entity type.
This information is usually taken from the parameterized collection or map
element type. You must supply it explicitly, however, if your field isn't a
parameterized type.
</para>
</listitem>
<listitem>
<para>
<literal>String mappedBy</literal>: Names the many to many field in the related
entity that maps this bidirectional relation. We explain bidirectional relations
in <xref linkend="jpa_overview_meta_mappedby"/> above. Leaving this
property unset signals that this is a standard unidirectional relation.
</para>
</listitem>
<listitem>
<para>
<literal>CascadeType[] cascade</literal>: Array of enum values defining cascade
behavior for the collection elements. We explore cascades above in
<xref linkend="jpa_overview_meta_cascade"/>. Defaults to an empty array.
</para>
</listitem>
<listitem>
<para>
<literal>FetchType fetch</literal>: Whether to load the field eagerly
(<literal>FetchType.EAGER</literal>) or lazily
(<literal>FetchType.LAZY</literal>). Defaults to <literal>
FetchType.LAZY</literal>. See <xref linkend="jpa_overview_meta_fetch"/> above
for details on fetch types.
</para>
</listitem>
</itemizedlist>
<para>
The equivalent XML element is <literal>many-to-many</literal>. It accepts the
following attributes:
</para>
<itemizedlist>
<listitem>
<para>
<literal>name</literal>: The name of the field or property. This attribute is
required.
</para>
</listitem>
<listitem>
<para>
<literal>target-entity</literal>: The class of the related type.
</para>
</listitem>
<listitem>
<para>
<literal>fetch</literal>: One of <literal>EAGER</literal> or <literal>
LAZY</literal>.
</para>
</listitem>
<listitem>
<para>
<literal>mapped-by</literal>: The field that owns the relation. See
<xref linkend="jpa_overview_meta_field"/>.
</para>
</listitem>
</itemizedlist>
<para>
You may also nest the <literal>cascade</literal> element within a <literal>
many-to-many</literal> element.
</para>
</section>
<section id="jpa_overview_meta_orderby">
<title>
Order By
</title>
<indexterm zone="jpa_overview_meta_orderby">
<primary>
OrderBy
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_orderby">
<primary>
metadata
</primary>
<secondary>
OrderBy
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_orderby">
<primary>
annotations
</primary>
<secondary>
OrderBy
</secondary>
</indexterm>
<para>
Datastores such as relational databases do not preserve the order of records.
Your persistent <classname>List</classname> fields might be ordered one way the
first time you retrieve an object from the datastore, and a completely different
way the next. To ensure consistent ordering of collection fields, you must use
the <classname>OrderBy</classname> annotation. The <classname>OrderBy
</classname> annotation's value is a string defining the order of the collection
elements. An empty value means to sort on the identity value(s) of the elements
in ascending order. Any other value must be of the form:
</para>
<programlisting>
&lt;field name&gt;[ ASC|DESC][, ...]
</programlisting>
<para>
Each <literal>&lt;field name&gt;</literal> is the name of a persistent field in
the collection's element type. You can optionally follow each field by the
keyword <literal>ASC</literal> for ascending order, or <literal>DESC</literal>
for descending order. If the direction is omitted, it defaults to ascending.
</para>
<para>
The equivalent XML element is <literal>order-by</literal> which can be listed as
a sub-element of the <literal>one-to-many</literal> or <literal>many-to-many
</literal> elements. The text within this element is parsed as the order by
string.
</para>
</section>
<section id="jpa_overview_meta_mapkey">
<title>
Map Key
</title>
<indexterm zone="jpa_overview_meta_mapkey">
<primary>
MapKey
</primary>
</indexterm>
<indexterm zone="jpa_overview_meta_mapkey">
<primary>
metadata
</primary>
<secondary>
MapKey
</secondary>
</indexterm>
<indexterm zone="jpa_overview_meta_mapkey">
<primary>
annotations
</primary>
<secondary>
MapKey
</secondary>
</indexterm>
<para>
JPA supports persistent <classname>Map</classname> fields through either a
<link linkend="jpa_overview_meta_onetomany"><classname> OneToMany</classname>
</link> or <link linkend="jpa_overview_meta_manytomany"><classname>ManyToMany
</classname></link> association. The related entities form the map values. JPA
derives the map keys by extracting a field from each entity value. The
<classname>MapKey</classname> annotation designates the field that is used as
the key. It has the following properties:
</para>
<itemizedlist>
<listitem>
<para>
<literal>String name</literal>: The name of a field in the related entity class
to use as the map key. If no name is given, defaults to the identity field of
the related entity class.
</para>
</listitem>
</itemizedlist>
<para>
The equivalent XML element is <literal>map-key</literal> which can be listed as
a sub-element of the <literal>one-to-many</literal> or <literal>many-to-many
</literal> elements. The <literal>map-key</literal> element has the following
attributes:
</para>
<itemizedlist>
<listitem>
<para>
<literal>name</literal>: The name of the field in the related entity class to
use as the map key.
</para>
</listitem>
</itemizedlist>
</section>
<section id="jpa_overview_meta_fielddefaults">
<title>
Persistent Field Defaults
</title>
<para>
In the absence of any of the annotations above, JPA defines the following
default behavior for declared fields:
</para>
<orderedlist>
<listitem>
<para>
Fields declared <literal>static, transient</literal>, or <literal>final
</literal> default to non-persistent.
</para>
</listitem>
<listitem>
<para>
Fields of any primitive type, primitive wrapper type, <classname>
java.lang.String</classname>, <classname>byte[]</classname>, <classname>
Byte[]</classname>, <classname>char[]</classname>, <classname>
Character[]</classname>, <classname>java.math.BigDecimal</classname>,
<classname>java.math.BigInteger</classname>, <classname>
java.util.Date</classname>, <classname> java.util.Calendar</classname>,
<classname>java.sql.Date</classname>, <classname>java.sql.Timestamp</classname>,
or any <classname>Serializable</classname> type default to persistent, as if
annotated with <link linkend="jpa_overview_meta_basic"><literal>
@Basic</literal></link>.
</para>
</listitem>
<listitem>
<para>
Fields of an embeddable type default to persistent, as if annotated with
<link linkend="jpa_overview_meta_embedded"><literal>@Embedded</literal></link>.
</para>
</listitem>
<listitem>
<para>
All other fields default to non-persistent.
</para>
</listitem>
</orderedlist>
<para>
Note that according to these defaults, all relations between entities must be
annotated explicitly. Without an annotation, a relation field will default to
serialized storage if the related entity type is serializable, or will default
to being non-persistent if not.
</para>
</section>
</section>
<section id="jpa_overview_meta_xml">
<title>
XML Schema
</title>
<indexterm>
<primary>
metadata
</primary>
<secondary>
XSD
</secondary>
</indexterm>
<indexterm>
<primary>
JPA
</primary>
<secondary>
metadata
</secondary>
<tertiary>
XML
</tertiary>
<seealso>
metadata
</seealso>
</indexterm>
<para>
The latest revision of the version 2.0 orm schema is presented below. Version
2.0 of the schema must be used if JPA 2.0 elements are specified as XML
metadata. Many of the elements in the schema relate to object/relational
mapping rather than metadata; these elements are discussed in
<xref linkend="jpa_overview_mapping"/>. Version 1.0 of the orm schema can be
found at <ulink url="http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"/>.
</para>
<programlisting>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!-- Java Persistence API object/relational mapping file schema --&gt;
&lt;xsd:schema targetNamespace="http://java.sun.com/xml/ns/persistence/orm"
xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified"
version="2.0"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@(#)orm_2_0.xsd 2.0 October 1 2009
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
Copyright 2005-2009 Sun Microsystems, Inc. All rights reserved.
The contents of this file are subject to the terms of either the
GNU General Public License Version 2 only ("GPL") or the Common
Development and Distribution License("CDDL") (collectively, the
"License"). You may not use this file except in compliance with
the License. You can obtain a copy of the License at
https://glassfish.dev.java.net/public/CDDL+GPL.html or
glassfish/bootstrap/legal/LICENSE.txt. See the License for the
specific language governing permissions and limitations under the
License.
When distributing the software, include this License Header
Notice in each file and include the License file at
glassfish/bootstrap/legal/LICENSE.txt. Sun designates this
particular file as subject to the "Classpath" exception as
provided by Sun in the GPL Version 2 section of the License file
that accompanied this code. If applicable, add the following
below the License Header, with the fields enclosed by brackets []
replaced by your own identifying information:
"Portions Copyrighted [year] [name of copyright owner]"
Contributor(s):
If you wish your version of this file to be governed by only the
CDDL or only the GPL Version 2, indicate your decision by adding
"[Contributor] elects to include this software in this
distribution under the [CDDL or GPL Version 2] license." If you
don't indicate a single choice of license, a recipient has the
option to distribute your version of this file under either the
CDDL, the GPL Version 2 or to extend the choice of license to its
licensees as provided above. However, if you add GPL Version 2
code and therefore, elected the GPL Version 2 license, then the
option applies only if the new code is made subject to such
option by the copyright holder.
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
&lt;![CDATA[
This is the XML Schema for the persistence object/relational
mapping file.
The file may be named "META-INF/orm.xml" in the persistence
archive or it may be named some other name which would be
used to locate the file as resource on the classpath.
Object/relational mapping files must indicate the object/relational
mapping file schema by using the persistence namespace:
http://java.sun.com/xml/ns/persistence
and indicate the version of the schema by
using the version element as shown below:
&lt;entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence/orm/orm_2_0.xsd"
version="2.0"&gt;
...
&lt;/entity-mappings&gt;
]]&gt;
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:complexType name="emptyType" /&gt;
&lt;xsd:simpleType name="versionType"&gt;
&lt;xsd:restriction base="xsd:token"&gt;
&lt;xsd:pattern value="[0-9]+(\.[0-9]+)*" /&gt;
&lt;/xsd:restriction&gt;
&lt;/xsd:simpleType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:element name="entity-mappings"&gt;
&lt;xsd:complexType&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
The entity-mappings element is the root element of a mapping
file. It contains the following four types of elements:
1. The persistence-unit-metadata element contains metadata
for the entire persistence unit. It is undefined if this element
occurs in multiple mapping files within the same
persistence unit.
2. The package, schema, catalog and access elements apply to all of
the entity, mapped-superclass and embeddable
elements defined in
the same file in which they occur.
3. The sequence-generator, table-generator, named-query,
named-native-query and sql-result-set-mapping
elements are global
to the persistence unit. It is undefined to have more than one
sequence-generator or table-generator of the same
name in the same
or different mapping files in a persistence unit. It is also
undefined to have more than one named-query,
named-native-query, or
result-set-mapping of the same name in the same or different mapping
files in a persistence unit.
4. The entity, mapped-superclass and embeddable elements each define
the mapping information for a managed persistent
class. The mapping
information contained in these elements may be complete or it may
be partial.
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="persistence-unit-metadata"
type="orm:persistence-unit-metadata" minOccurs="0" /&gt;
&lt;xsd:element name="package" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="schema" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="catalog" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="access" type="orm:access-type"
minOccurs="0" /&gt;
&lt;xsd:element name="sequence-generator" type="orm:sequence-generator"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="table-generator" type="orm:table-generator"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="named-query" type="orm:named-query"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="named-native-query" type="orm:named-native-query"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="sql-result-set-mapping"
type="orm:sql-result-set-mapping" minOccurs="0"
maxOccurs="unbounded" /&gt;
&lt;xsd:element name="mapped-superclass" type="orm:mapped-superclass"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="entity" type="orm:entity"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="embeddable" type="orm:embeddable"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="version" type="orm:versionType"
fixed="2.0" use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;/xsd:element&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="persistence-unit-metadata"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
Metadata that applies to the persistence unit and not just to
the mapping file in which it is contained.
If the xml-mapping-metadata-complete element is specified,
the complete set of mapping metadata for the persistence unit
is contained in the XML mapping files for the persistence unit.
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="xml-mapping-metadata-complete"
type="orm:emptyType" minOccurs="0" /&gt;
&lt;xsd:element name="persistence-unit-defaults"
type="orm:persistence-unit-defaults" minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="persistence-unit-defaults"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
These defaults are applied to the persistence unit as a whole
unless they are overridden by local annotation or XML
element settings.
schema - Used as the schema for all tables, secondary tables, join
tables, collection tables, sequence generators, and table
generators that apply to the persistence unit
catalog - Used as the catalog for all tables, secondary tables, join
tables, collection tables, sequence generators, and
table generators that apply to the persistence unit
delimited-identifiers - Used to treat database identifiers as
delimited identifiers.
access - Used as the access type for all managed classes in
the persistence unit
cascade-persist - Adds cascade-persist to the set of cascade options
in all entity relationships of the persistence unit
entity-listeners - List of default entity listeners to be invoked
on each entity in the persistence unit.
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="schema" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="catalog" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="delimited-identifiers" type="orm:emptyType"
minOccurs="0" /&gt;
&lt;xsd:element name="access" type="orm:access-type"
minOccurs="0" /&gt;
&lt;xsd:element name="cascade-persist" type="orm:emptyType"
minOccurs="0" /&gt;
&lt;xsd:element name="entity-listeners" type="orm:entity-listeners"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="entity"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
Defines the settings and mappings for an entity. Is allowed to be
sparsely populated and used in conjunction with the annotations.
Alternatively, the metadata-complete attribute can be
used to
indicate that no annotations on the entity class (and its fields
or properties) are to be processed. If this is the case then
the defaulting rules for the entity and its subelements will
be recursively applied.
@Target(TYPE) @Retention(RUNTIME)
public @interface Entity {
String name() default "";
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="table" type="orm:table"
minOccurs="0" /&gt;
&lt;xsd:element name="secondary-table" type="orm:secondary-table"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="primary-key-join-column"
type="orm:primary-key-join-column" minOccurs="0"
maxOccurs="unbounded" /&gt;
&lt;xsd:element name="id-class" type="orm:id-class"
minOccurs="0" /&gt;
&lt;xsd:element name="inheritance" type="orm:inheritance"
minOccurs="0" /&gt;
&lt;xsd:element name="discriminator-value" type="orm:discriminator-value"
minOccurs="0" /&gt;
&lt;xsd:element name="discriminator-column" type="orm:discriminator-column"
minOccurs="0" /&gt;
&lt;xsd:element name="sequence-generator" type="orm:sequence-generator"
minOccurs="0" /&gt;
&lt;xsd:element name="table-generator" type="orm:table-generator"
minOccurs="0" /&gt;
&lt;xsd:element name="named-query" type="orm:named-query"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="named-native-query" type="orm:named-native-query"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="sql-result-set-mapping" type="orm:sql-result-set-mapping"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="exclude-default-listeners"
type="orm:emptyType" minOccurs="0" /&gt;
&lt;xsd:element name="exclude-superclass-listeners"
type="orm:emptyType" minOccurs="0" /&gt;
&lt;xsd:element name="entity-listeners" type="orm:entity-listeners"
minOccurs="0" /&gt;
&lt;xsd:element name="pre-persist" type="orm:pre-persist"
minOccurs="0" /&gt;
&lt;xsd:element name="post-persist" type="orm:post-persist"
minOccurs="0" /&gt;
&lt;xsd:element name="pre-remove" type="orm:pre-remove"
minOccurs="0" /&gt;
&lt;xsd:element name="post-remove" type="orm:post-remove"
minOccurs="0" /&gt;
&lt;xsd:element name="pre-update" type="orm:pre-update"
minOccurs="0" /&gt;
&lt;xsd:element name="post-update" type="orm:post-update"
minOccurs="0" /&gt;
&lt;xsd:element name="post-load" type="orm:post-load"
minOccurs="0" /&gt;
&lt;xsd:element name="attribute-override" type="orm:attribute-override"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="association-override" type="orm:association-override"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="attributes" type="orm:attributes"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" /&gt;
&lt;xsd:attribute name="class" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="access" type="orm:access-type" /&gt;
&lt;xsd:attribute name="cacheable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="metadata-complete" type="xsd:boolean" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:simpleType name="access-type"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
This element determines how the persistence provider accesses the
state of an entity or embedded object.
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:restriction base="xsd:token"&gt;
&lt;xsd:enumeration value="PROPERTY" /&gt;
&lt;xsd:enumeration value="FIELD" /&gt;
&lt;/xsd:restriction&gt;
&lt;/xsd:simpleType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="association-override"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
public @interface AssociationOverride {
String name();
JoinColumn[] joinColumns() default{};
JoinTable joinTable() default @JoinTable;
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string" minOccurs="0" /&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="join-column" type="orm:join-column"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="join-table" type="orm:join-table"
minOccurs="0" /&gt;
&lt;/xsd:choice&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="attribute-override"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
public @interface AttributeOverride {
String name();
Column column();
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="column" type="orm:column" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="attributes"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
This element contains the entity field or property mappings.
It may be sparsely populated to include only a subset of the
fields or properties. If metadata-complete for the entity is true
then the remainder of the attributes will be defaulted according
to the default rules.
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="id" type="orm:id"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="embedded-id" type="orm:embedded-id"
minOccurs="0" /&gt;
&lt;/xsd:choice&gt;
&lt;xsd:element name="basic" type="orm:basic"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="version" type="orm:version"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="many-to-one" type="orm:many-to-one"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="one-to-many" type="orm:one-to-many"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="one-to-one" type="orm:one-to-one"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="many-to-many" type="orm:many-to-many"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="element-collection" type="orm:element-collection"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="embedded" type="orm:embedded"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="transient" type="orm:transient"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="basic"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Basic {
FetchType fetch() default EAGER;
boolean optional() default true;
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="column" type="orm:column"
minOccurs="0" /&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="lob" type="orm:lob"
minOccurs="0" /&gt;
&lt;xsd:element name="temporal" type="orm:temporal"
minOccurs="0" /&gt;
&lt;xsd:element name="enumerated" type="orm:enumerated"
minOccurs="0" /&gt;
&lt;/xsd:choice&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="fetch" type="orm:fetch-type" /&gt;
&lt;xsd:attribute name="optional" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="access" type="orm:access-type" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="cascade-type"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
public enum CascadeType { ALL, PERSIST, MERGE, REMOVE, REFRESH,
DETACH};
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="cascade-all" type="orm:emptyType"
minOccurs="0" /&gt;
&lt;xsd:element name="cascade-persist" type="orm:emptyType"
minOccurs="0" /&gt;
&lt;xsd:element name="cascade-merge" type="orm:emptyType"
minOccurs="0" /&gt;
&lt;xsd:element name="cascade-remove" type="orm:emptyType"
minOccurs="0" /&gt;
&lt;xsd:element name="cascade-refresh" type="orm:emptyType"
minOccurs="0" /&gt;
&lt;xsd:element name="cascade-detach" type="orm:emptyType"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="collection-table"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface CollectionTable {
String name() default "";
String catalog() default "";
String schema() default "";
JoinColumn[] joinColumns() default {};
UniqueConstraint[] uniqueConstraints() default {};
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="join-column" type="orm:join-column"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="unique-constraint" type="orm:unique-constraint"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" /&gt;
&lt;xsd:attribute name="catalog" type="xsd:string" /&gt;
&lt;xsd:attribute name="schema" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="column"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Column {
String name() default "";
boolean unique() default false;
boolean nullable() default true;
boolean insertable() default true;
boolean updatable() default true;
String columnDefinition() default "";
String table() default "";
int length() default 255;
int precision() default 0; // decimal precision
int scale() default 0; // decimal scale
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="name" type="xsd:string" /&gt;
&lt;xsd:attribute name="unique" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="nullable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="insertable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="updatable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="column-definition" type="xsd:string" /&gt;
&lt;xsd:attribute name="table" type="xsd:string" /&gt;
&lt;xsd:attribute name="length" type="xsd:int" /&gt;
&lt;xsd:attribute name="precision" type="xsd:int" /&gt;
&lt;xsd:attribute name="scale" type="xsd:int" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="column-result"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({}) @Retention(RUNTIME)
public @interface ColumnResult {
String name();
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="discriminator-column"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE}) @Retention(RUNTIME)
public @interface DiscriminatorColumn {
String name() default "DTYPE";
DiscriminatorType discriminatorType() default STRING;
String columnDefinition() default "";
int length() default 31;
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="name" type="xsd:string" /&gt;
&lt;xsd:attribute name="discriminator-type" type="orm:discriminator-type" /&gt;
&lt;xsd:attribute name="column-definition" type="xsd:string" /&gt;
&lt;xsd:attribute name="length" type="xsd:int" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:simpleType name="discriminator-type"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
public enum DiscriminatorType { STRING, CHAR, INTEGER };
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:restriction base="xsd:token"&gt;
&lt;xsd:enumeration value="STRING" /&gt;
&lt;xsd:enumeration value="CHAR" /&gt;
&lt;xsd:enumeration value="INTEGER" /&gt;
&lt;/xsd:restriction&gt;
&lt;/xsd:simpleType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:simpleType name="discriminator-value"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE}) @Retention(RUNTIME)
public @interface DiscriminatorValue {
String value();
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:restriction base="xsd:string" /&gt;
&lt;/xsd:simpleType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="element-collection"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface ElementCollection {
Class targetClass() default void.class;
FetchType fetch() default LAZY;
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="order-by" type="orm:order-by"
minOccurs="0" /&gt;
&lt;xsd:element name="order-column" type="orm:order-column"
minOccurs="0" /&gt;
&lt;/xsd:choice&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="map-key" type="orm:map-key"
minOccurs="0" /&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="map-key-class" type="orm:map-key-class"
minOccurs="0" /&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="map-key-temporal"
type="orm:temporal" minOccurs="0" /&gt;
&lt;xsd:element name="map-key-enumerated"
type="orm:enumerated" minOccurs="0" /&gt;
&lt;xsd:element name="map-key-attribute-override"
type="orm:attribute-override" minOccurs="0"
maxOccurs="unbounded" /&gt;
&lt;/xsd:choice&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="map-key-column"
type="orm:map-key-column" minOccurs="0" /&gt;
&lt;xsd:element name="map-key-join-column"
type="orm:map-key-join-column" minOccurs="0"
maxOccurs="unbounded" /&gt;
&lt;/xsd:choice&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:choice&gt;
&lt;xsd:choice&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="column" type="orm:column"
minOccurs="0" /&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="temporal" type="orm:temporal"
minOccurs="0" /&gt;
&lt;xsd:element name="enumerated" type="orm:enumerated"
minOccurs="0" /&gt;
&lt;xsd:element name="lob" type="orm:lob"
minOccurs="0" /&gt;
&lt;/xsd:choice&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="attribute-override"
type="orm:attribute-override" minOccurs="0"
maxOccurs="unbounded" /&gt;
&lt;xsd:element name="association-override"
type="orm:association-override" minOccurs="0"
maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:choice&gt;
&lt;xsd:element name="collection-table" type="orm:collection-table"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="target-class" type="xsd:string" /&gt;
&lt;xsd:attribute name="fetch" type="orm:fetch-type" /&gt;
&lt;xsd:attribute name="access" type="orm:access-type" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="embeddable"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
Defines the settings and mappings for embeddable objects. Is
allowed to be sparsely populated and used in conjunction with
the annotations. Alternatively, the metadata-complete attribute
can be used to indicate that no annotations are to be processed
in the class. If this is the case then the defaulting rules will
be recursively applied.
@Target({TYPE}) @Retention(RUNTIME)
public @interface Embeddable {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="attributes" type="orm:embeddable-attributes"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="class" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="access" type="orm:access-type" /&gt;
&lt;xsd:attribute name="metadata-complete" type="xsd:boolean" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="embeddable-attributes"&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="basic" type="orm:basic"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="many-to-one" type="orm:many-to-one"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="one-to-many" type="orm:one-to-many"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="one-to-one" type="orm:one-to-one"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="many-to-many" type="orm:many-to-many"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="element-collection" type="orm:element-collection"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="embedded" type="orm:embedded"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="transient" type="orm:transient"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="embedded"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Embedded {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="attribute-override" type="orm:attribute-override"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="association-override" type="orm:association-override"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="access" type="orm:access-type" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="embedded-id"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface EmbeddedId {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="attribute-override" type="orm:attribute-override"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="access" type="orm:access-type" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="entity-listener"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
Defines an entity listener to be invoked at lifecycle events
for the entities that list this listener.
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="pre-persist" type="orm:pre-persist"
minOccurs="0" /&gt;
&lt;xsd:element name="post-persist" type="orm:post-persist"
minOccurs="0" /&gt;
&lt;xsd:element name="pre-remove" type="orm:pre-remove"
minOccurs="0" /&gt;
&lt;xsd:element name="post-remove" type="orm:post-remove"
minOccurs="0" /&gt;
&lt;xsd:element name="pre-update" type="orm:pre-update"
minOccurs="0" /&gt;
&lt;xsd:element name="post-update" type="orm:post-update"
minOccurs="0" /&gt;
&lt;xsd:element name="post-load" type="orm:post-load"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="class" type="xsd:string" use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="entity-listeners"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE}) @Retention(RUNTIME)
public @interface EntityListeners {
Class[] value();
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="entity-listener" type="orm:entity-listener"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="entity-result"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({}) @Retention(RUNTIME)
public @interface EntityResult {
Class entityClass();
FieldResult[] fields() default {};
String discriminatorColumn() default "";
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="field-result" type="orm:field-result"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="entity-class" type="xsd:string"
use="required" /&gt;
&lt;xsd:attribute name="discriminator-column" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:simpleType name="enum-type"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
public enum EnumType {
ORDINAL,
STRING
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:restriction base="xsd:token"&gt;
&lt;xsd:enumeration value="ORDINAL" /&gt;
&lt;xsd:enumeration value="STRING" /&gt;
&lt;/xsd:restriction&gt;
&lt;/xsd:simpleType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:simpleType name="enumerated"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Enumerated {
EnumType value() default ORDINAL;
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:restriction base="orm:enum-type" /&gt;
&lt;/xsd:simpleType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:simpleType name="fetch-type"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
public enum FetchType { LAZY, EAGER };
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:restriction base="xsd:token"&gt;
&lt;xsd:enumeration value="LAZY" /&gt;
&lt;xsd:enumeration value="EAGER" /&gt;
&lt;/xsd:restriction&gt;
&lt;/xsd:simpleType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="field-result"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({}) @Retention(RUNTIME)
public @interface FieldResult {
String name();
String column();
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="column" type="xsd:string"
use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="generated-value"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface GeneratedValue {
GenerationType strategy() default AUTO;
String generator() default "";
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="strategy" type="orm:generation-type" /&gt;
&lt;xsd:attribute name="generator" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:simpleType name="generation-type"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO };
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:restriction base="xsd:token"&gt;
&lt;xsd:enumeration value="TABLE" /&gt;
&lt;xsd:enumeration value="SEQUENCE" /&gt;
&lt;xsd:enumeration value="IDENTITY" /&gt;
&lt;xsd:enumeration value="AUTO" /&gt;
&lt;/xsd:restriction&gt;
&lt;/xsd:simpleType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="id"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Id {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="column" type="orm:column"
minOccurs="0" /&gt;
&lt;xsd:element name="generated-value" type="orm:generated-value"
minOccurs="0" /&gt;
&lt;xsd:element name="temporal" type="orm:temporal"
minOccurs="0" /&gt;
&lt;xsd:element name="table-generator" type="orm:table-generator"
minOccurs="0" /&gt;
&lt;xsd:element name="sequence-generator" type="orm:sequence-generator"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="access" type="orm:access-type" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="id-class"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE}) @Retention(RUNTIME)
public @interface IdClass {
Class value();
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="class" type="xsd:string" use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="inheritance"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE}) @Retention(RUNTIME)
public @interface Inheritance {
InheritanceType strategy() default SINGLE_TABLE;
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="strategy" type="orm:inheritance-type" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:simpleType name="inheritance-type"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
public enum InheritanceType
{ SINGLE_TABLE, JOINED, TABLE_PER_CLASS};
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:restriction base="xsd:token"&gt;
&lt;xsd:enumeration value="SINGLE_TABLE" /&gt;
&lt;xsd:enumeration value="JOINED" /&gt;
&lt;xsd:enumeration value="TABLE_PER_CLASS" /&gt;
&lt;/xsd:restriction&gt;
&lt;/xsd:simpleType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="join-column"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface JoinColumn {
String name() default "";
String referencedColumnName() default "";
boolean unique() default false;
boolean nullable() default true;
boolean insertable() default true;
boolean updatable() default true;
String columnDefinition() default "";
String table() default "";
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="name" type="xsd:string" /&gt;
&lt;xsd:attribute name="referenced-column-name" type="xsd:string" /&gt;
&lt;xsd:attribute name="unique" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="nullable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="insertable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="updatable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="column-definition" type="xsd:string" /&gt;
&lt;xsd:attribute name="table" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="join-table"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface JoinTable {
String name() default "";
String catalog() default "";
String schema() default "";
JoinColumn[] joinColumns() default {};
JoinColumn[] inverseJoinColumns() default {};
UniqueConstraint[] uniqueConstraints() default {};
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="join-column" type="orm:join-column"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="inverse-join-column" type="orm:join-column"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="unique-constraint" type="orm:unique-constraint"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" /&gt;
&lt;xsd:attribute name="catalog" type="xsd:string" /&gt;
&lt;xsd:attribute name="schema" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="lob"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Lob {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:simpleType name="lock-mode-type"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
public enum LockModeType { READ, WRITE, OPTIMISTIC,
OPTIMISTIC_FORCE_INCREMENT, PESSIMISTIC_READ,
PESSIMISTIC_WRITE,
PESSIMISTIC_FORCE_INCREMENT, NONE};
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:restriction base="xsd:token"&gt;
&lt;xsd:enumeration value="READ" /&gt;
&lt;xsd:enumeration value="WRITE" /&gt;
&lt;xsd:enumeration value="OPTIMISTIC" /&gt;
&lt;xsd:enumeration value="OPTIMISTIC_FORCE_INCREMENT" /&gt;
&lt;xsd:enumeration value="PESSIMISTIC_READ" /&gt;
&lt;xsd:enumeration value="PESSIMISTIC_WRITE" /&gt;
&lt;xsd:enumeration value="PESSIMISTIC_FORCE_INCREMENT" /&gt;
&lt;xsd:enumeration value="NONE" /&gt;
&lt;/xsd:restriction&gt;
&lt;/xsd:simpleType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="many-to-many"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface ManyToMany {
Class targetEntity() default void.class;
CascadeType[] cascade() default {};
FetchType fetch() default LAZY;
String mappedBy() default "";
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="order-by" type="orm:order-by"
minOccurs="0" /&gt;
&lt;xsd:element name="order-column" type="orm:order-column"
minOccurs="0" /&gt;
&lt;/xsd:choice&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="map-key" type="orm:map-key"
minOccurs="0" /&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="map-key-class" type="orm:map-key-class"
minOccurs="0" /&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="map-key-temporal"
type="orm:temporal" minOccurs="0" /&gt;
&lt;xsd:element name="map-key-enumerated"
type="orm:enumerated" minOccurs="0" /&gt;
&lt;xsd:element name="map-key-attribute-override"
type="orm:attribute-override" minOccurs="0"
maxOccurs="unbounded" /&gt;
&lt;/xsd:choice&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="map-key-column"
type="orm:map-key-column" minOccurs="0" /&gt;
&lt;xsd:element name="map-key-join-column"
type="orm:map-key-join-column" minOccurs="0"
maxOccurs="unbounded" /&gt;
&lt;/xsd:choice&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:choice&gt;
&lt;xsd:element name="join-table" type="orm:join-table"
minOccurs="0" /&gt;
&lt;xsd:element name="cascade" type="orm:cascade-type"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="target-entity" type="xsd:string" /&gt;
&lt;xsd:attribute name="fetch" type="orm:fetch-type" /&gt;
&lt;xsd:attribute name="access" type="orm:access-type" /&gt;
&lt;xsd:attribute name="mapped-by" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="many-to-one"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface ManyToOne {
Class targetEntity() default void.class;
CascadeType[] cascade() default {};
FetchType fetch() default EAGER;
boolean optional() default true;
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="join-column" type="orm:join-column"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="join-table" type="orm:join-table"
minOccurs="0" /&gt;
&lt;/xsd:choice&gt;
&lt;xsd:element name="cascade" type="orm:cascade-type"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="target-entity" type="xsd:string" /&gt;
&lt;xsd:attribute name="fetch" type="orm:fetch-type" /&gt;
&lt;xsd:attribute name="optional" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="access" type="orm:access-type" /&gt;
&lt;xsd:attribute name="maps-id" type="xsd:string" /&gt;
&lt;xsd:attribute name="id" type="xsd:boolean" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="map-key"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface MapKey {
String name() default "";
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="name" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="map-key-class"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface MapKeyClass {
Class value();
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="class" type="xsd:string" use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="map-key-column"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface MapKeyColumn {
String name() default "";
boolean unique() default false;
boolean nullable() default false;
boolean insertable() default true;
boolean updatable() default true;
String columnDefinition() default "";
String table() default "";
int length() default 255;
int precision() default 0; // decimal precision
int scale() default 0; // decimal scale
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="name" type="xsd:string" /&gt;
&lt;xsd:attribute name="unique" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="nullable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="insertable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="updatable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="column-definition" type="xsd:string" /&gt;
&lt;xsd:attribute name="table" type="xsd:string" /&gt;
&lt;xsd:attribute name="length" type="xsd:int" /&gt;
&lt;xsd:attribute name="precision" type="xsd:int" /&gt;
&lt;xsd:attribute name="scale" type="xsd:int" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="map-key-join-column"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface MapKeyJoinColumn {
String name() default "";
String referencedColumnName() default "";
boolean unique() default false;
boolean nullable() default false;
boolean insertable() default true;
boolean updatable() default true;
String columnDefinition() default "";
String table() default "";
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="name" type="xsd:string" /&gt;
&lt;xsd:attribute name="referenced-column-name" type="xsd:string" /&gt;
&lt;xsd:attribute name="unique" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="nullable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="insertable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="updatable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="column-definition" type="xsd:string" /&gt;
&lt;xsd:attribute name="table" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="mapped-superclass"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
Defines the settings and mappings for a mapped superclass. Is
allowed to be sparsely populated and used in conjunction with
the annotations. Alternatively, the metadata-complete attribute
can be used to indicate that no annotations are to be processed
If this is the case then the defaulting rules will be recursively
applied.
@Target(TYPE) @Retention(RUNTIME)
public @interface MappedSuperclass{}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="id-class" type="orm:id-class"
minOccurs="0" /&gt;
&lt;xsd:element name="exclude-default-listeners"
type="orm:emptyType" minOccurs="0" /&gt;
&lt;xsd:element name="exclude-superclass-listeners"
type="orm:emptyType" minOccurs="0" /&gt;
&lt;xsd:element name="entity-listeners" type="orm:entity-listeners"
minOccurs="0" /&gt;
&lt;xsd:element name="pre-persist" type="orm:pre-persist"
minOccurs="0" /&gt;
&lt;xsd:element name="post-persist" type="orm:post-persist"
minOccurs="0" /&gt;
&lt;xsd:element name="pre-remove" type="orm:pre-remove"
minOccurs="0" /&gt;
&lt;xsd:element name="post-remove" type="orm:post-remove"
minOccurs="0" /&gt;
&lt;xsd:element name="pre-update" type="orm:pre-update"
minOccurs="0" /&gt;
&lt;xsd:element name="post-update" type="orm:post-update"
minOccurs="0" /&gt;
&lt;xsd:element name="post-load" type="orm:post-load"
minOccurs="0" /&gt;
&lt;xsd:element name="attributes" type="orm:attributes"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="class" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="access" type="orm:access-type" /&gt;
&lt;xsd:attribute name="metadata-complete" type="xsd:boolean" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="named-native-query"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE}) @Retention(RUNTIME)
public @interface NamedNativeQuery {
String name();
String query();
QueryHint[] hints() default {};
Class resultClass() default void.class;
String resultSetMapping() default ""; //named SqlResultSetMapping
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="query" type="xsd:string" /&gt;
&lt;xsd:element name="hint" type="orm:query-hint"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="result-class" type="xsd:string" /&gt;
&lt;xsd:attribute name="result-set-mapping" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="named-query"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE}) @Retention(RUNTIME)
public @interface NamedQuery {
String name();
String query();
LockModeType lockMode() default NONE;
QueryHint[] hints() default {};
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="query" type="xsd:string" /&gt;
&lt;xsd:element name="lock-mode" type="orm:lock-mode-type"
minOccurs="0" /&gt;
&lt;xsd:element name="hint" type="orm:query-hint"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="one-to-many"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OneToMany {
Class targetEntity() default void.class;
CascadeType[] cascade() default {};
FetchType fetch() default LAZY;
String mappedBy() default "";
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="order-by" type="orm:order-by"
minOccurs="0" /&gt;
&lt;xsd:element name="order-column" type="orm:order-column"
minOccurs="0" /&gt;
&lt;/xsd:choice&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="map-key" type="orm:map-key"
minOccurs="0" /&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="map-key-class" type="orm:map-key-class"
minOccurs="0" /&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="map-key-temporal"
type="orm:temporal" minOccurs="0" /&gt;
&lt;xsd:element name="map-key-enumerated"
type="orm:enumerated" minOccurs="0" /&gt;
&lt;xsd:element name="map-key-attribute-override"
type="orm:attribute-override" minOccurs="0"
maxOccurs="unbounded" /&gt;
&lt;/xsd:choice&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="map-key-column"
type="orm:map-key-column" minOccurs="0" /&gt;
&lt;xsd:element name="map-key-join-column"
type="orm:map-key-join-column" minOccurs="0"
maxOccurs="unbounded" /&gt;
&lt;/xsd:choice&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:choice&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="join-table" type="orm:join-table"
minOccurs="0" /&gt;
&lt;xsd:element name="join-column" type="orm:join-column"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:choice&gt;
&lt;xsd:element name="cascade" type="orm:cascade-type"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="target-entity" type="xsd:string" /&gt;
&lt;xsd:attribute name="fetch" type="orm:fetch-type" /&gt;
&lt;xsd:attribute name="access" type="orm:access-type" /&gt;
&lt;xsd:attribute name="mapped-by" type="xsd:string" /&gt;
&lt;xsd:attribute name="orphan-removal" type="xsd:boolean" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="one-to-one"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OneToOne {
Class targetEntity() default void.class;
CascadeType[] cascade() default {};
FetchType fetch() default EAGER;
boolean optional() default true;
String mappedBy() default "";
boolean orphanRemoval() default false;
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:choice&gt;
&lt;xsd:element name="primary-key-join-column"
type="orm:primary-key-join-column" minOccurs="0"
maxOccurs="unbounded" /&gt;
&lt;xsd:element name="join-column" type="orm:join-column"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="join-table" type="orm:join-table"
minOccurs="0" /&gt;
&lt;/xsd:choice&gt;
&lt;xsd:element name="cascade" type="orm:cascade-type"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="target-entity" type="xsd:string" /&gt;
&lt;xsd:attribute name="fetch" type="orm:fetch-type" /&gt;
&lt;xsd:attribute name="optional" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="access" type="orm:access-type" /&gt;
&lt;xsd:attribute name="mapped-by" type="xsd:string" /&gt;
&lt;xsd:attribute name="orphan-removal" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="maps-id" type="xsd:string" /&gt;
&lt;xsd:attribute name="id" type="xsd:boolean" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:simpleType name="order-by"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OrderBy {
String value() default "";
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:restriction base="xsd:string" /&gt;
&lt;/xsd:simpleType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="order-column"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OrderColumn {
String name() default "";
boolean nullable() default true;
boolean insertable() default true;
boolean updatable() default true;
String columnDefinition() default "";
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="name" type="xsd:string" /&gt;
&lt;xsd:attribute name="nullable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="insertable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="updatable" type="xsd:boolean" /&gt;
&lt;xsd:attribute name="column-definition" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="post-load"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD}) @Retention(RUNTIME)
public @interface PostLoad {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="method-name" type="xsd:string"
use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="post-persist"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD}) @Retention(RUNTIME)
public @interface PostPersist {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="method-name" type="xsd:string"
use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="post-remove"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD}) @Retention(RUNTIME)
public @interface PostRemove {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="method-name" type="xsd:string"
use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="post-update"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD}) @Retention(RUNTIME)
public @interface PostUpdate {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="method-name" type="xsd:string"
use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="pre-persist"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD}) @Retention(RUNTIME)
public @interface PrePersist {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="method-name" type="xsd:string"
use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="pre-remove"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD}) @Retention(RUNTIME)
public @interface PreRemove {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="method-name" type="xsd:string"
use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="pre-update"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD}) @Retention(RUNTIME)
public @interface PreUpdate {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="method-name" type="xsd:string"
use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="primary-key-join-column"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
public @interface PrimaryKeyJoinColumn {
String name() default "";
String referencedColumnName() default "";
String columnDefinition() default "";
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="name" type="xsd:string" /&gt;
&lt;xsd:attribute name="referenced-column-name" type="xsd:string" /&gt;
&lt;xsd:attribute name="column-definition" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="query-hint"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({}) @Retention(RUNTIME)
public @interface QueryHint {
String name();
String value();
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="value" type="xsd:string" use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="secondary-table"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE}) @Retention(RUNTIME)
public @interface SecondaryTable {
String name();
String catalog() default "";
String schema() default "";
PrimaryKeyJoinColumn[] pkJoinColumns() default {};
UniqueConstraint[] uniqueConstraints() default {};
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="primary-key-join-column"
type="orm:primary-key-join-column" minOccurs="0"
maxOccurs="unbounded" /&gt;
&lt;xsd:element name="unique-constraint" type="orm:unique-constraint"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="catalog" type="xsd:string" /&gt;
&lt;xsd:attribute name="schema" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="sequence-generator"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
public @interface SequenceGenerator {
String name();
String sequenceName() default "";
String catalog() default "";
String schema() default "";
int initialValue() default 1;
int allocationSize() default 50;
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="sequence-name" type="xsd:string" /&gt;
&lt;xsd:attribute name="catalog" type="xsd:string" /&gt;
&lt;xsd:attribute name="schema" type="xsd:string" /&gt;
&lt;xsd:attribute name="initial-value" type="xsd:int" /&gt;
&lt;xsd:attribute name="allocation-size" type="xsd:int" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="sql-result-set-mapping"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE}) @Retention(RUNTIME)
public @interface SqlResultSetMapping {
String name();
EntityResult[] entities() default {};
ColumnResult[] columns() default {};
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="entity-result" type="orm:entity-result"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;xsd:element name="column-result" type="orm:column-result"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="table"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE}) @Retention(RUNTIME)
public @interface Table {
String name() default "";
String catalog() default "";
String schema() default "";
UniqueConstraint[] uniqueConstraints() default {};
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="unique-constraint" type="orm:unique-constraint"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" /&gt;
&lt;xsd:attribute name="catalog" type="xsd:string" /&gt;
&lt;xsd:attribute name="schema" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="table-generator"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
public @interface TableGenerator {
String name();
String table() default "";
String catalog() default "";
String schema() default "";
String pkColumnName() default "";
String valueColumnName() default "";
String pkColumnValue() default "";
int initialValue() default 0;
int allocationSize() default 50;
UniqueConstraint[] uniqueConstraints() default {};
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="description" type="xsd:string"
minOccurs="0" /&gt;
&lt;xsd:element name="unique-constraint" type="orm:unique-constraint"
minOccurs="0" maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="table" type="xsd:string" /&gt;
&lt;xsd:attribute name="catalog" type="xsd:string" /&gt;
&lt;xsd:attribute name="schema" type="xsd:string" /&gt;
&lt;xsd:attribute name="pk-column-name" type="xsd:string" /&gt;
&lt;xsd:attribute name="value-column-name" type="xsd:string" /&gt;
&lt;xsd:attribute name="pk-column-value" type="xsd:string" /&gt;
&lt;xsd:attribute name="initial-value" type="xsd:int" /&gt;
&lt;xsd:attribute name="allocation-size" type="xsd:int" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:simpleType name="temporal"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Temporal {
TemporalType value();
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:restriction base="orm:temporal-type" /&gt;
&lt;/xsd:simpleType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:simpleType name="temporal-type"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
public enum TemporalType {
DATE, // java.sql.Date
TIME, // java.sql.Time
TIMESTAMP // java.sql.Timestamp
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:restriction base="xsd:token"&gt;
&lt;xsd:enumeration value="DATE" /&gt;
&lt;xsd:enumeration value="TIME" /&gt;
&lt;xsd:enumeration value="TIMESTAMP" /&gt;
&lt;/xsd:restriction&gt;
&lt;/xsd:simpleType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="transient"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Transient {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="unique-constraint"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({}) @Retention(RUNTIME)
public @interface UniqueConstraint {
String name() default "";
String[] columnNames();
}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="column-name" type="xsd:string"
maxOccurs="unbounded" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" /&gt;
&lt;/xsd:complexType&gt;
&lt;!-- **************************************************** --&gt;
&lt;xsd:complexType name="version"&gt;
&lt;xsd:annotation&gt;
&lt;xsd:documentation&gt;
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Version {}
&lt;/xsd:documentation&gt;
&lt;/xsd:annotation&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="column" type="orm:column"
minOccurs="0" /&gt;
&lt;xsd:element name="temporal" type="orm:temporal"
minOccurs="0" /&gt;
&lt;/xsd:sequence&gt;
&lt;xsd:attribute name="name" type="xsd:string" use="required" /&gt;
&lt;xsd:attribute name="access" type="orm:access-type" /&gt;
&lt;/xsd:complexType&gt;
&lt;/xsd:schema&gt;
</programlisting>
</section>
<section id="jpa_overview_meta_complete">
<title>
Conclusion
</title>
<para>
That exhausts persistence metadata annotations. We present the class definitions
for our sample model below:
</para>
<example id="jpa_overview_meta_complete_ex">
<title>
Complete Metadata
</title>
<programlisting>
package org.mag;
@Entity
@IdClass(Magazine.MagazineId.class)
public class Magazine {
@Id private String isbn;
@Id private String title;
@Version private int version;
private double price; // defaults to @Basic
private int copiesSold; // defaults to @Basic
@OneToOne(fetch=FetchType.LAZY,
cascade={CascadeType.PERSIST,CascadeType.REMOVE})
private Article coverArticle;
@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE})
@OrderBy
private Collection&lt;Article&gt; articles;
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.PERSIST)
private Company publisher;
@Transient private byte[] data;
...
public static class MagazineId {
...
}
}
@Entity
public class Article {
@Id private long id;
@Version private int version;
private String title; // defaults to @Basic
private byte[] content; // defaults to @Basic
@ManyToMany(cascade=CascadeType.PERSIST)
@OrderBy("lastName, firstName")
private Collection&lt;Author&gt; authors;
...
}
package org.mag.pub;
@Entity
public class Company {
@Id private long id;
@Version private int version;
private String name; // defaults to @Basic
private double revenue; // defaults to @Basic
private Address address; // defaults to @Embedded
@OneToMany(mappedBy="publisher", cascade=CascadeType.PERSIST)
private Collection&lt;Magazine&gt; mags;
@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE})
private Collection&lt;Subscription&gt; subscriptions;
...
}
@Entity
public class Author {
@Id private long id;
@Version private int version;
private String firstName; // defaults to @Basic
private double lastName; // defaults to @Basic
private Address address; // defaults to @Embedded
@ManyToMany(mappedBy="authors", cascade=CascadeType.PERSIST)
private Collection&lt;Article&gt; arts;
...
}
@Embeddable
public class Address {
private String street; // defaults to @Basic
private String city; // defaults to @Basic
private String state; // defaults to @Basic
private String zip; // defaults to @Basic
...
}
package org.mag.subscribe;
@MappedSuperclass
public abstract class Document {
@Id private long id;
@Version private int version;
...
}
@Entity
public class Contract
extends Document {
private String terms; // defaults to @Basic
...
}
@Entity
public class Subscription {
@Id private long id;
@Version private int version;
private Date startDate; // defaults to @Basic
private double payment; // defaults to @Basic
@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE})
@MapKey(name="num")
private Map&lt;Long,LineItem&gt; lineItems;
...
@Entity
public static class LineItem
extends Contract {
private String comments; // defaults to @Basic
private double price; // defaults to @Basic
private long num; // defaults to @Basic
@ManyToOne
private Magazine magazine;
...
}
}
@Entity(name="Lifetime")
public class LifetimeSubscription
extends Subscription {
@Basic(fetch=FetchType.LAZY)
private boolean getEliteClub() { ... }
public void setEliteClub(boolean elite) { ... }
...
}
@Entity(name="Trial")
public class TrialSubscription
extends Subscription {
public Date getEndDate() { ... }
public void setEndDate(Date end) { ... }
...
}
</programlisting>
<para>
The same metadata declarations in XML:
</para>
<programlisting>
&lt;entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
version="1.0"&gt;
&lt;!-- declares a default access type for all entities --&gt;
&lt;access-type&gt;FIELD&lt;/access-type&gt;
&lt;mapped-superclass class="org.mag.subscribe.Document"&gt;
&lt;attributes&gt;
&lt;id name="id"&gt;
&lt;generated-value strategy="IDENTITY"/&gt;
&lt;/id&gt;
&lt;version name="version"/&gt;
&lt;/attributes&gt;
&lt;/mapped-superclass&gt;
&lt;entity class="org.mag.Magazine"&gt;
&lt;id-class="org.mag.Magazine$MagazineId"/&gt;
&lt;attributes&gt;
&lt;id name="isbn"/&gt;
&lt;id name="title"/&gt;
&lt;basic name="name"/&gt;
&lt;basic name="price"/&gt;
&lt;basic name="copiesSold"/&gt;
&lt;version name="version"/&gt;
&lt;many-to-one name="publisher" fetch="LAZY"&gt;
&lt;cascade&gt;
&lt;cascade-persist/&gt;
&lt;/cascade&gt;
&lt;/many-to-one&gt;
&lt;one-to-many name="articles"&gt;
&lt;order-by/&gt;
&lt;cascade&gt;
&lt;cascade-persist/&gt;
&lt;cascade-remove/&gt;
&lt;/cascade&gt;
&lt;/one-to-many&gt;
&lt;one-to-one name="coverArticle" fetch="LAZY"&gt;
&lt;cascade&gt;
&lt;cascade-persist/&gt;
&lt;cascade-remove/&gt;
&lt;/cascade&gt;
&lt;/one-to-one&gt;
&lt;transient name="data"/&gt;
&lt;/attributes&gt;
&lt;/entity&gt;
&lt;entity class="org.mag.Article"&gt;
&lt;attributes&gt;
&lt;id name="id"/&gt;
&lt;basic name="title"/&gt;
&lt;basic name="content"/&gt;
&lt;version name="version"/&gt;
&lt;many-to-many name="articles"&gt;
&lt;order-by&gt;lastName, firstName&lt;/order-by&gt;
&lt;/many-to-many&gt;
&lt;/attributes&gt;
&lt;/entity&gt;
&lt;entity class="org.mag.pub.Company"&gt;
&lt;attributes&gt;
&lt;id name="id"/&gt;
&lt;basic name="name"/&gt;
&lt;basic name="revenue"/&gt;
&lt;version name="version"/&gt;
&lt;one-to-many name="mags" mapped-by="publisher"&gt;
&lt;cascade&gt;
&lt;cascade-persist/&gt;
&lt;/cascade&gt;
&lt;/one-to-many&gt;
&lt;one-to-many name="subscriptions"&gt;
&lt;cascade&gt;
&lt;cascade-persist/&gt;
&lt;cascade-remove/&gt;
&lt;/cascade&gt;
&lt;/one-to-many&gt;
&lt;/attributes&gt;
&lt;/entity&gt;
&lt;entity class="org.mag.pub.Author"&gt;
&lt;attributes&gt;
&lt;id name="id"/&gt;
&lt;basic name="firstName"/&gt;
&lt;basic name="lastName"/&gt;
&lt;version name="version"/&gt;
&lt;many-to-many name="arts" mapped-by="authors"&gt;
&lt;cascade&gt;
&lt;cascade-persist/&gt;
&lt;/cascade&gt;
&lt;/many-to-many&gt;
&lt;/attributes&gt;
&lt;/entity&gt;
&lt;entity class="org.mag.subcribe.Contract"&gt;
&lt;attributes&gt;
&lt;basic name="terms"/&gt;
&lt;/attributes&gt;
&lt;/entity&gt;
&lt;entity class="org.mag.subcribe.Subscription"&gt;
&lt;attributes&gt;
&lt;id name="id"/&gt;
&lt;basic name="payment"/&gt;
&lt;basic name="startDate"/&gt;
&lt;version name="version"/&gt;
&lt;one-to-many name="items"&gt;
&lt;map-key name="num"&gt;
&lt;cascade&gt;
&lt;cascade-persist/&gt;
&lt;cascade-remove/&gt;
&lt;/cascade&gt;
&lt;/one-to-many&gt;
&lt;/attributes&gt;
&lt;/entity&gt;
&lt;entity class="org.mag.subscribe.Subscription.LineItem"&gt;
&lt;attributes&gt;
&lt;basic name="comments"/&gt;
&lt;basic name="price"/&gt;
&lt;basic name="num"/&gt;
&lt;many-to-one name="magazine"/&gt;
&lt;/attributes&gt;
&lt;/entity&gt;
&lt;entity class="org.mag.subscribe.LifetimeSubscription" name="Lifetime"
access="PROPERTY"&gt;
&lt;attributes&gt;
&lt;basic name="eliteClub" fetch="LAZY"/&gt;
&lt;/attributes&gt;
&lt;/entity&gt;
&lt;entity class="org.mag.subscribe.TrialSubscription" name="Trial"&gt;
&lt;attributes&gt;
&lt;basic name="endDate"/&gt;
&lt;/attributes&gt;
&lt;/entity&gt;
&lt;embeddable class="org.mag.pub.Address"&gt;
&lt;attributes&gt;
&lt;basic name="street"/&gt;
&lt;basic name="city"/&gt;
&lt;basic name="state"/&gt;
&lt;basic name="zip"/&gt;
&lt;/attributes&gt;
&lt;/embeddable&gt;
&lt;/entity-mappings&gt;
</programlisting>
</example>
<para>
<xref linkend="jpa_overview_mapping"/> will show you how to map your
persistent classes to the datastore using additional annotations and XML markup.
First, however, we turn to the JPA runtime APIs.
</para>
</section>
</chapter>