United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...

 

Note: Starting with Oracle TopLink 11g, JPA support is provided through EclipseLink. EclipseLink supports the JPA 1.0 implementation as well as may extensions, including those previously known as TopLink JPA. Please see http://www.eclipse.org/eclipselink for more information.

 

TopLink JPA Annotation Reference

The Java Persistence API (JPA), part of the Java Enterprise Edition 5 (Java EE 5) Enterprise JavaBeans (EJB) 3.0 specification, greatly simplifies Java persistence and provides an object-relational mapping approach that allows you to declaratively define how to map Java objects to relational database tables in a standard, portable way that works both inside a Java EE 5 application server and outside an EJB container in a Java Standard Edition (Java SE) 5 application.

When using TopLink JPA, you can configure the JPA behavior of your entities using annotations. An annotation is a simple, expressive means of decorating Java source code with metadata that is compiled into the corresponding Java class files for interpretation at runtime by TopLink JPA to manage JPA behavior.

For example, to designate a Java class as a JPA entity, use the @Entity annotation as follows:

@Entity
public class Employee implements Serializable {
    ...
}

You can selectively decorate your entity classes with annotations to override defaults. This is known as configuration by exception.

This reference quotes extensively from the JSR-220 Enterprise JavaBeans v.3.0 Java Persistence API specification to summarize annotation information by category (see Table 1-1) and explains when and how you use these annotations to customize JPA behavior to meet your application requirements.

For more information, see:

Table 1-1 JPA Annotations by Category

CategoryDescriptionAnnotations

Entity

By default, TopLink JPA assumes that a Java class is non-persistent and not eligible for JPA services unless it is decorated with this annotation.

Use this annotation to designate a plain old Java object (POJO) class as an entity so that you can use it with JPA services.

You must designate a class as a JPA entity (either using this annotation or the orm.xml file) before you can use the class with JPA services.

@Entity


Database Schema Attributes

By default, TopLink JPA assumes that an entity's name corresponds to a database table of the same name and that an entity's data member names correspond to database columns with the same names.

Use these annotations to override this default behavior and fine-tune the relationship between your object model and data model.

@Table

@SecondaryTable

@SecondaryTables

@Column

@JoinColumn

@JoinColumns

@PrimaryKeyJoinColumn

@PrimaryKeyJoinColumns

@JoinTable

@UniqueConstraint


Identity

By default, TopLink JPA assumes that each entity must have at least one field or property that serves as a primary key.

Use these annotations to specify one of the following:

  • one @Id

  • multiple @Id and an @IdClass

  • one @EmbeddedId

You can also use these annotations to fine-tune how your database maintains the identity of your entities.

@Id

@IdClass

@EmbeddedId

@GeneratedValue

@SequenceGenerator

@TableGenerator


Direct Mappings

By default, TopLink JPA automatically configures a Basic mapping for most Java primitive types, wrappers of the primitive types, and enums.

Use these annotations to fine-tune how your database implements these mappings.

@Basic

@Enumerated

@Temporal

@Lob

@Transient


Relationship Mappings

TopLink JPA requires that you map relationships explicitly, but TopLink allows some defaulting.

Use these annotations to specify the type and characteristics of entity relationships to fine-tune how your database implements these relationships.

@OneToOne

@ManyToOne

@OneToMany

@ManyToMany

@MapKey

@OrderBy


Composition

Some objects cannot exist on their own, but can only be embedded within owning entities.

Use these annotations to specify objects that are embedded and to override how they are mapped in the owning entity's table.

@Embeddable

@Embedded

@AttributeOverride

@AttributeOverrides

@AssociationOverride

@AssociationOverrides


Inheritance

By default, TopLink JPA assumes that all persistent fields are defined by a single entity class.

Use these annotations if your entity class inherits some or all persistent fields from one or more superclasses.

@Inheritance

@DiscriminatorColumn

@DiscriminatorValue

@MappedSuperclass

@AssociationOverride

@AssociationOverrides

@AttributeOverride

@AttributeOverrides


Locking

By default, TopLink JPA assumes that the application is responsible for data consistency.

It is recommended that you use this annotation to enable TopLink JPA-managed optimistic locking.

@Version


Lifecycle Callback Events

By default, TopLink JPA handles all persistence operations.

Use these annotations to associate methods with JPA lifecycle events if you need to invoke custom logic at any point during the entity lifecycle. Figure 1-1 illustrates the relationship amongst these lifecycle events.

@PrePersist

@PostPersist

@PreRemove

@PostRemove

@PreUpdate

@PostUpdate

@PostLoad

@EntityListeners

@ExcludeDefaultListeners

@ExcludeSuperclassListeners


Entity Manager

In an application that uses TopLink JPA, you perform all persistence operations (create, read, update, and delete) using an instance of EntityManager.

Use these annotations to declare or inject an entity manager or entity manager factory.

@PersistenceUnit

@PersistenceUnits

@PersistenceContext

@PersistenceContexts

@PersistenceProperty


Queries

In an application that uses TopLink JPA, you can use an entity manager to create and execute queries dynamically or you can pre-define queries and execute them by name at run time.

Use these annotations to pre-define queries and manage their result sets.

@NamedQuery

@NamedQueries

@NamedNativeQuery

@NamedNativeQueries

@QueryHint

@ColumnResult

@EntityResult

@FieldResult

@SqlResultSetMapping

@SqlResultSetMappings



@AssociationOverride

By default, TopLink JPA automatically assumes that a subclass inherits both persistent properties and their association mappings as defined in a superclass.

Use the @AssociationOverride annotation to customize an @OneToOne or @ManyToOne mapping inherited from a @MappedSuperclass or in an @Embeddable to change the @JoinColumn associated with the existing field or property.

If you have more than one @AssociationOverride change to make, you must use @AssociationOverrides.

To customize a basic mapping to change its @Column, use @AttributeOverride.

Table 1-2 lists the attributes of this annotation . For more details, see the API.

Example 1-1 shows a @MappedSuperclass that the entity in Example 1-2 extends. Example 1-2 shows how to use @AssociationOverride in the entity subclass to override the @JoinColumn defined (by default) in the @MappedSuperclass Employee for the association to Address.

With @AssociationOverride, the PartTimeEmployee table would have the Address relationship mapped to the ADDR_ID column. Other entity subclasses of Employee would inherit the default mapping to the ADDRESS_ID column, assuming that the primary key column of Address is ID.

@AssociationOverrides

If you need to specify more than one @AssociationOverride, you must specify all your association overrides using a single @AssociationOverrides annotation.

Table 1-3 lists the attributes of this annotation . For more details, see the API.

Example 1-3 shows how to use this annotation to specify two association overrides.

@AttributeOverride

By default, TopLink JPA automatically assumes that a subclass inherits both persistent properties and their basic mappings as defined in a mapped superclass.

Use the @AttributeOverride annotation to customize a basic mapping inherited from a @MappedSuperclass or in an @Embeddable to change the @Column associated with the field or property.

If you have more than one @AttributeOverride change to make, you must use @AttributeOverrides.

To customize an association mapping to change its @JoinColumn, use @AssociationOverride.

Table 1-4 lists the attributes of this annotation . For more details, see the API.

Example 1-5 shows how to use @AttributeOverride in the entity subclass to override the @Column defined (by default) in the @MappedSuperclass Employee for the basic mapping to id.

With the @AttributeOverride annotation, the PartTimeEmployee table would have the id attribute mapped to the PTEMP_ID column. Other entity subclasses of Employee would inherit the default mapping to the ID column.

@Basic

By default, TopLink JPA automatically configures a @Basic mapping for most Java primitive types, wrappers of the primitive types, and enums.

Use the @Basic annotation to configure the fetch type to LAZY.

Table 1-6 lists the attributes of this annotation . For more details, see the API.

Example 1-7 shows how to use this annotation to specify a fetch type of LAZY for a basic mapping.

@Column

By default, TopLink JPA assumes that each of an entity's persistent attributes is stored in a database table column whose name matches that of the persistent field or property.

Use the @Column annotation:

Table 1-7 lists the attributes of this annotation . For more details, see the API.

Table 1-7 @Column Attributes

AttributeRequiredDescription

name

Optional


Default: TopLink JPA assumes that each of an entity's persistent attributes is stored in a database table column whose name matches that of the persistent field or property.

To specify an alternative column name, set name to the String column name you want.

unique

Optional


Default: false.

By default, TopLink JPA assumes that all non-primary key columns are allowed to contain duplicate values.

If this column is not allowed to contain duplicate values, set unique to true. When set to true, this is equivalent to using @UniqueConstraint at the table level.

nullable

Optional


Default: true.

By default, TopLink JPA assumes that all columns are allowed to contain a null value.

If this column is not allowed to contain a null value, set nullable to false.

insertable

Optional


Default: true.

By default, TopLink JPA assumes that all columns are always included in SQL INSERT statements.

If this column should not be included in these statements, set insertable to false.

updatable

Optional


Default: true.

By default, TopLink JPA assumes that a column is always included in SQL UPDATE statements.

If this column should not be included in these statements, set updatable to false.

columnDefinition

Optional


Default: empty String.

By default, TopLink JPA creates a database table column with minimal SQL.

If you want the column created with more specialized options, set columnDefinition to the SQL fragment that you want TopLink JPA to use when generating the DDL for the column.

table

Optional


Default: TopLink JPA assumes that all the persistent attributes of an entity are stored in a single database table whose name is the entity name or is specified by @Table (see @Table).

If this column is associated with a secondary table (see @SecondaryTable), set name to the String name of the appropriate secondary table name as Example 1-8 shows.

length

Optional


Default: 255

By default, TopLink JPA assumes that all columns have a maximum length of 255 characters when used to hold a String value.

If this column width is inappropriate for your application or database, set the length to the int value appropriate for your database column.

precision

Optional


Default: 0.

By default, TopLink JPA assumes that all columns have a precision of 0 when used to hold a decimal (exact numeric) value.

If this precision is inappropriate for your application or database, set precision to the appropriate int precision.

scale

Optional


Default: 0.

By default, TopLink JPA assumes that all columns have a scale of 0 when used to hold a decimal (exact numeric) value.

If this scale is inappropriate for your application or database, set scale to the appropriate int precision.


Example 1-8 shows how to use this annotation to make TopLink JPA persist salary to column SAL in secondary table EMP_SAL. By default, TopLink JPA persists salary to column salary in primary table EMPLOYEE.

@ColumnResult

When you execute a @NamedNativeQuery, it can return entities (including entities of different types), scalar values, or a combination of both.

Use the @ColumnResult annotation to return scalar values. The type of the scalar is determined by the type of the column you identify in the @ColumnResult.

For more information, see also @EntityResult, @FieldResult, and @SqlResultSetMapping.

Table 1-8 lists the attributes of this annotation . For more details, see the API.

Example 1-9 shows how to use this annotation to include Item (see Example 1-10 scalar name in the result list (see Example 1-11). In this case, the result list would be a List of Object arrays like: {[Order, "Shoes"], [Order, "Socks"], ...}.

@DiscriminatorColumn

By default, when @Inheritance attribute strategy is InheritanceType.SINGLE_TABLE or JOINED, TopLink JPA creates a discriminator column named DTYPE to differentiate classes in an inheritance hierarchy.

Use the @DiscriminatorColumn annotation:

  • to specify a discriminator column name if the column name in your data model is not the default column name DTYPE.

  • to specify a discriminator column length that is appropriate for your application or a pre-existing data model

  • to fine-tune the characteristics of the discriminator column in your database

Table 1-9 lists the attributes of this annotation . For more details, see the API.

Table 1-9 @DiscriminatorColumn Attributes

AttributeRequiredDescription

name

Optional


Default: TopLink JPA assumes that the discriminator column is named " DTYPE".

To specify an alternative column name, set name to the String column name you want.

discriminatorType

Optional


Default: DiscriminatorType.STRING.

By default, TopLink JPA assumes that the discriminator type is a String.

If you want to use a different type, set discriminatorType to DiscriminatorType.CHAR or DiscriminatorType.INTEGER.

Your @DiscriminatorValue must conform to this type.

columnDefinition

Optional


Default: empty String.

By default, TopLink JPA creates a database table column with minimal SQL.

If you want the column created with more specialized options, set columnDefinition to the SQL fragment that you want TopLink JPA to use when generating the DDL for the column.

length

Optional


Default: 31

By default, TopLink JPA assumes that the discriminator column has a maximum length of 31 characters when used to hold a String value.

If this column width is inappropriate for your application or database, set the length to the int value appropriate for your database column.

Your @DiscriminatorValue must conform to this length.


Example 1-12 shows how to use this annotation to specify a discriminator column named DISC of type STRING and length 20. In this example, the @DiscriminatorValue for this class is specified as CUST. The ValuedCustomer subclass specifies its own @DiscriminatorValue of VIP. In both Customer and ValuedCustomer, the value for @DiscriminatorValue must be convertable to the type specified by @DiscriminatorColumn attribute discriminatorType and must conform to @DiscriminatorColumn attribute length.

@DiscriminatorValue

By default, when @Inheritance attribute strategy is InheritanceType.SINGLE_TABLE or JOINED, TopLink JPA uses the entity name as a @DiscriminatorValue to differentiate classes in the inheritance hierarchy (see @Entity).

Use the @DiscriminatorValue annotation to specify the discriminator value used to differentiate an entity in this inheritance hierarchy:

  • if the entity name is inappropriate for this application

  • to match an existing database schema

Table 1-10 lists the attributes of this annotation . For more details, see the API.

Example 1-13 shows how to use this annotation to specify a discriminator column named DISC of type STRING and length 20. In this example, the @DiscriminatorValue for this class is specified as CUST. The ValuedCustomer subclass specifies its own @DiscriminatorValue of VIP. In both Customer and ValuedCustomer, the value for @DiscriminatorValue must be convertable to the type specified by @DiscriminatorColumn attribute discriminatorType and must conform to @DiscriminatorColumn attribute length.

@Embedded

By default, TopLink JPA assumes that every entity is persisted to its own database table.

Use the @Embedded annotation to specify a persistent field whose @Embeddable type can be stored as an intrinsic part of the owning entity and share the identity of the entity. Each of the persistent properties or fields of the embedded object is mapped to the database table for the owning entity.

You can use @Embedded in conjunction with @Embeddable to model a strict ownership relationship so that if the owning object is removed, the owned object is also removed.

Embedded objects should not be mapped across more than one table.

By default, column definitions (see @Column) specified in the @Embeddable class apply to the table of the owning entity. If you want to override these column definitions, use @AttributeOverride.

This annotation has no attributes. For more details, see the API.

Example 1-15 shows how to use this annotation to specify that @Embeddable class EmploymentPeriod (see Example 1-14) may be embedded in the entity class using the specified attribute overrides (see @AttributeOverride). If you do not need attribute overrides, you can omit the @Embedded annotation entirely: TopLink JPA will infer that EmploymentPeriod is embedded from its @Embeddable annotation.

@EmbeddedId

Use the @EmbeddedId annotation to specify an embeddable composite primary key class (usually made up of two or more primitive or JDK object types) owned by the entity. Composite primary keys typically arise when mapping from legacy databases when the database key is comprised of several columns.

A composite primary key class has the following characteristics:

  • It is a plain old Java object (POJO) class.

  • It must be public and must have a public no-argument constructor.

  • If you use property-based access, the properties of the primary key class must be public or protected.

  • It must be serializable.

  • It must define equals and hashCode methods.

    The semantics of value equality for these methods must be consistent with the database equality for the database types to which the key is mapped.

Alternatively, you can make the composite primary key class a non-embedded class (see @IdClass).

This annotation has no attributes . For more details, see the API.

Example 1-16 shows a typical composite primary key class, annotated as @Embeddable. Example 1-17 shows how to configure an entity with this embeddable composite primary key class using the @EmbeddedId annotation.

@Entity

Use the @Entity annotation to designate a plain old Java object (POJO) class as an entity and make it eligible for JPA services. You must designate a POJO class as an entity before you can use any other JPA annotations.

Table 1-11 lists the attributes of this annotation . For more details, see the API.

Example 1-18 shows how to use this annotation.

@EntityListeners

You can use lifecycle annotations (see Lifecycle Event Annotations) to designate methods that execute your logic when specified lifecycle events occur.

Use the @EntityListeners annotation to associate one or more entity listener classes with an @Entity or @MappedSuperclass if you need to execute logic when specified lifecycle events occur and:

  • You do not want to expose lifecycle listener methods in your entity API.

  • You want to share lifecycle listener logic between different entity types.

When a lifecycle event occurs on the entity or subclass, TopLink JPA notifies each entity listener class in the order in which listeners are defined, and invokes the entity listener method (if any) annotated with the corresponding lifecycle event type.

An entity listener class has the following characteristics:

  • It is a plain old Java object (POJO) class

  • It has one or more callback methods with the following signature:

    public void <MethodName>(Object)
    

    You may specify an argument type of Object or the type of the entity class you will associate the entity listener with.

  • It has each callback method annotated with one or more lifecycle event annotations.

    You may associate a lifecycle event with one and only one callback listener method but you may associate a given callback listener method with more than one lifecycle event.

If you use entity listeners, you can manage what entity listeners are invoked using @ExcludeDefaultListeners and @ExcludeSuperclassListeners.

Table 1-12 lists the attributes of this annotation . For more details, see the API.

Example 1-19 shows how to use this annotation to associate entity listener classes EmployeePersistListener (see Example 1-20) and EmployeeRemoveListener (see Example 1-21) with the entity Employee. Example 1-21 shows that you can associate more than one lifecycle event with a given entity listener class method but any given lifecycle event may appear in an entity listener class only once.

@EntityResult

When you execute a @NamedNativeQuery, it can return entities (including entities of different types), scalar values, or a combination of both.

Use the @EntityResult annotation to return entities.

For more information, see also @ColumnResult, @FieldResult, and @SqlResultSetMapping.

Table 1-13 lists the attributes of this annotation . For more details, see the API.

Table 1-13 @EntityResult Attributes

AttributeRequiredDescription

entityClass

Required


Set entityClass to the Class of the entity returned by the query.

fields

Optional


Default: empty FieldResult array.

By default, TopLink JPA assumes that the SELECT statement includes all the columns that correspond to all the fields or properties of the entity returned and the column names in the SELECT statement correspond to the field or property names ( AS statements are not used).

If your SELECT statement includes only some of the columns that correspond to the fields or properties of the entity returned or the column names in the SELECT statement do not correspond to the field or property names ( AS statements are used), set fields to an array of @FieldResult, one @FieldResult per column in the SELECT statement.

discriminatorColumn

Optional


Default: empty String.

By default, TopLink JPA assumes that a discriminator column (see @Inheritance) is not included in the SELECT statement.

If you use a discriminator column in your SELECT statement, set discriminatorColumn to the String column name you use.


Example 1-22 shows how to use this annotation to include both Order and Item (see Example 1-23) entities in the result list (see Example 1-24). In this case, the result list would be a List of Object arrays like: {[Order, Item], [Order, Item], ...}.

@Enumerated

By default, TopLink JPA persists the ordinal values of enumerated constants.

Use the @Enumerated annotation to specify whether TopLink JPA should persist ordinal or String values of enumerated constants if the String value suits your application requirements or to match an existing database schema.

This annotation can be used with @Basic.

Table 1-14 lists the attributes of this annotation . For more details, see the API.

Given the enumerated constants in Example 1-25, Example 1-26 shows how to use this annotation to specify that the String value of SalaryRate should be written to the database when Employee is persisted. By default, the ordinal value of EmployeeStatus is written to the database.

@ExcludeDefaultListeners

A default listener is a lifecycle event listener class specified in the orm.xml file that applies to all entities in a persistence unit (see @PersistenceUnit). TopLink JPA first invokes default listeners, if any, in the order defined in the orm.xml file, before any other entity listeners (see @EntityListeners).

Use the @ExcludeDefaultListeners annotation to override (and prevent) default listener execution for a given @Entity or @MappedSuperclass if default listener behavior does not apply.

This annotation has no attributes . For more details, see the API.

Example 1-27 shows how to use this annotation to specify that default listeners should not be executed for the Employee entity.

@ExcludeSuperclassListeners

If the @Entity and @MappedSuperclass classes in an inheritance hierarchy define @EntityListeners, by default, TopLink JPA invokes superclass listeners before subclass listeners.

Use the @ExcludeSuperclassListeners annotation to override (and prevent) superclass listener execution for a given @Entity or @MappedSuperclass if superclass listener behavior does not apply.

The @ExcludeSuperclassListeners annotation does not affect default listeners (see @ExcludeDefaultListeners).

This annotation has no attributes . For more details, see the API.

Example 1-28 shows how to use this annotation to specify that superclass listener EmployeeListener should not be executed for the PartTimeEmployee entity but default listeners and subclass listeners PartTimeEmployeeListener1 and PartTimeEmployeeListener2 are executed.

@FieldResult

When you execute a @NamedNativeQuery, it can return entities (including entities of different types), scalar values, or a combination of both.

By default, TopLink JPA assumes that when returning entities with @EntityResult, the SELECT statement includes all the columns that correspond to all the fields or properties of the entity returned and the column names in the SELECT statement correspond to the field or property names (AS statements are not used).

Use the @FieldResult annotation to map columns in the SELECT statement to fields or properties when returning entities with @EntityResult if your SELECT statement includes only some of the columns that correspond to the fields or properties of the entity returned or the column names in the SELECT statement do not correspond to the field or property names ( AS statements are used).

For more information, see also @ColumnResult and @SqlResultSetMapping.

Table 1-15 lists the attributes of this annotation . For more details, see the API.

Example 1-30 shows how to use this annotation to include both Order and Item (see Example 1-31) entities in the result list (see Example 1-32). In this case, the result list would be a List of Object arrays like: {[Order, Item], [Order, Item], ...}.

@GeneratedValue

By default, the application is responsible for supplying and setting entity identifiers (see @Id).

Use the @GeneratedValue annotation if you want TopLink JPA to provide and manage entity identifiers.

Table 1-16 lists the attributes of this annotation . For more details, see the API.

Table 1-16 @GeneratedValue Attributes

AttributeRequiredDescription

strategy

Optional


Default: GenerationType.AUTO.

By default, TopLink JPA chooses the type of primary key generator that is most appropriate for the underlying database.

If you feel that another generator type is more appropriate for your database or application, set strategy to the GeneratorType you want:

  • IDENTITY - specify that TopLink JPA use a database identity column

  • AUTO - specify that TopLink JPA should choose a primary key generator that is most appropriate for the underlying database.

  • SEQUENCE - specify that TopLink JPA use a database sequence (see @SequenceGenerator)

  • TABLE - specify that TopLink JPA assign primary keys for the entity using an underlying database table to ensure uniqueness (see @TableGenerator)

generator

Optional


Default: TopLink JPA assigns a name to the primary key generator it selects.

If this name is awkward, a reserved word, incompatible with a pre-existing data model, or invalid as a primary key generator name in your database, set generator to the String generator name you want to use.


Example 1-33 shows how to use this annotation to tell TopLink JPA to use a primary key generator of type GeneratorType.SEQUENCE named CUST_SEQ.

@IdClass

Use the @IdClass annotation to specify a composite primary key class (usually made up of two or more primitive or JDK object types) for an entity. Composite primary keys typically arise when mapping from legacy databases when the database key is comprised of several columns.

A composite primary key class has the following characteristics:

Alternatively, you can make the composite primary key class an embedded class owned by the entity (see @EmbeddedId).

Table 1-17 lists the attributes of this annotation . For more details, see the API.

Example 1-35 shows a non-embedded composite primary key class. In this class, fields empName and birthDay must correspond in name and type to properties in the entity class. Example 1-36 shows how to configure a JPA entity with this non-embedded composite primary key class using the @IdClass annotation. Because entity class fields empName and birthDay are used in the primary key, you must also annotate them using the @Id annotation.

@Inheritance

By default, TopLink JPA automatically manages the persistence of entities in an inheritance hierarchy.

Use the @Inheritance annotation to customize the TopLink JPA inheritance hierarchy support to improve application performance or to match an existing data model.

Table 1-18 lists the attributes of this annotation . For more details, see the API.

Table 1-18 @Inheritance Attributes

AttributeRequiredDescription

strategy

Optional


Default: InheritanceType.SINGLE_TABLE.

By default, TopLink JPA assumes that all the classes in a hierarchy are mapped to a single table differentiated by the discriminator value (see @DiscriminatorValue) in the table's discriminator column (see @DiscriminatorColumn).

If this is not appropriate for your application or if you must match an existing data model, set strategy to the desired InheritanceType:

  • SINGLE_TABLE Foot 1  - all the classes in a hierarchy are mapped to a single table. The table has a discriminator column (see @DiscriminatorColumn) whose value (see @DiscriminatorValue) identifies the specific subclass to which the instance that is represented by the row belongs.

  • JOINED - the root of the class hierarchy is represented by a single table and each subclass is represented by a separate table. The table has a discriminator column (see @DiscriminatorColumn). Each subclass table additionally contains fields that are specific to the subclass (not inherited from its superclass) and primary key columns that serve as foreign keys to the primary keys of the superclass table.


Footnote 1 This option provides the best support for both polymorphic relationships between entities and queries that range over the class hierarchy. The disadvantages of this option include the need to make nullable columns that should be NOT NULL.

Example 1-37 shows how to use this annotation to specify that all subclasses of Customer will use InheritanceType.JOINED. The subclass in Example 1-38 will be mapped to its own table that contains a column for each the persistent properties of ValuedCustomer and one foreign key column that contains the primary key to the Customer table.

In Example 1-39, by default, InheritanceType.SINGLE_TABLE applies to Customer and all its subclasses. In this example, the default discriminator column DTYPE (see @DiscriminatorColumn) is specified as having a discriminator type of INTEGER and the @DiscriminatorValue for Customer is specified as 1. Example 1-40 shows how to specify the discriminator value for subclass ValuedCustomer as 2. In this example, all the persistent properties of both Customer and ValuedCustomer will be mapped to a single table.

@JoinColumn

By default, in an entity association, TopLink JPA assumes a database schema based on existing names (such as field or property names) so that it can automatically determine the single join column (the column that contains the foreign key) to use.

Use the @JoinColumn annotation if:

Table 1-19 lists the attributes of this annotation . For more details, see the API.

Table 1-19 @JoinColumn Attributes

AttributeRequiredDescription

name

Optional


Default: if you are using a single join column, TopLink JPA assumes that the name of the foreign key column is the name of the referencing relationship field or property + "_" + the name of the referenced primary key column.

If join columns are being used in a join table (see @JoinTable), the join column name is formed as the concatenation of the name of the entity + "_" + the name of the referenced primary key column.

If the join is for a one-to-one or many-to-one entity relationship, this column is in the table of the source entity. If the join is for a many-to-many entity relationship, this column is in a join table (see @JoinTable).

If the join column name is awkward, a reserved word, incompatible with a pre-existing data model, or invalid as a column name in your database, set name to the String column name you want.

referencedColumnName

Optional


Default: if you are using a single join column, TopLink JPA assumes that in an entity relationship, the referenced column name is the name of the referenced primary key column.

If used in a join table (see @JoinTable), the referenced key column is in the entity table of the owning entity, or inverse entity if the join is part of the inverse join definition.

To specify an alternative column name, set referencedColumnName to the String column name you want.

unique

Optional


Default: false.

By default, TopLink JPA assumes that join columns are allowed to contain duplicate values.

If this column is not allowed to contain duplicate values, set unique to true.

nullable

Optional


Default: true.

By default, TopLink JPA assumes that all columns are allowed to contain a null value.

If this column is not allowed to contain a null value, set nullable to false.

insertable

Optional


Default: true.

By default, TopLink JPA assumes that it can insert into all table columns.

If this column is read-only, set insertable to false.

updatable

Optional


Default: true.

By default, TopLink JPA assumes that it can update all table columns.

If this column is read-only, set updatable to false

columnDefinition

Optional


Default: empty String.

TopLink JPA creates a database table column with minimal SQL.

If you want the column created with more specialized options, set columnDefinition to the String SQL fragment that you want TopLink JPA to use when generating the DDL for the column.

table

Optional


Default: TopLink JPA assumes that join columns of one-to-one and many-to-one relationships are stored in a single database table whose name is the entity class name (see @Table).

If this column is associated with a secondary table (see @SecondaryTable), set name to the String name of the appropriate secondary table name as Example 1-8 shows.


Example 1-41 shows how to use this annotation to make TopLink JPA use database table Employee column ADDR_ID as the join column.

@JoinColumns

By default, in an entity association, TopLink JPA assumes that a single join column is used.

Use the @JoinColumns annotation if you want to specify two or more join columns (that is, a composite primary key).

Table 1-20 lists the attributes of this annotation . For more details, see the API.

Example 1-42 shows how to use this annotation to specify the names of two join columns: ADDR_ID in the Employee table which contains foreign key values from Address table column ID and ADDR_ZIP in the Employee table which contains foreign key values from Address table column ZIP.

@JoinTable

By default, TopLink JPA uses a join table when mapping entity associations on the owning side of a many-to-many association, or in a unidirectional one-to-many association. The join table name and its column names are all specified by defaults and TopLink JPA assumes that there is a join column for the primary key column of each of the entities in the relationship.

Use the @JoinTable annotation if you want to:

  • change the name of the join table because the default name is awkward, a reserved word, incompatible with a pre-existing data model, or invalid as a table name in your database

  • change the column names of the join table because the default names are awkward, a reserved word, incompatible with a pre-existing data model, or invalid as a column name in your database

  • configure the join table with a specific catalog or schema

  • configure one or more join table columns with a unique constraint

  • use multiple join columns per entity

Table 1-21 lists the attributes of this annotation . For more details, see the API.

Table 1-21 @JoinTable Attributes

AttributeRequiredDescription

name

Optional


Default: TopLink JPA names the join table by concatenating the table names of the associated primary tables (owning side first) using an underscore.

If such a join table name is awkward, a reserved word, or incompatible with a pre-existing data model, set name to the appropriate join table name. In Example 1-43, TopLink JPA uses the join table named PROJ_EMP.

catalog

Optional


Default: By default, TopLink JPA uses whatever the default catalog is for your database.

If the default catalog is inappropriate for your application, set the catalog to the String catalog name to use.

schema

Optional


Default: By default, TopLink JPA uses whatever the default schema is for your database.empty.

If the default schema is inappropriate for your application, set the schema to the String schema name to use.

joinColumns

Optional


Default: By default, TopLink JPA assumes that there is a single join column for the owning entity's primary key column. TopLink JPA names the column by concatenating the name of the owning entity + "_" + the name of the referenced primary key column.

If such a column name is awkward, a reserved word, incompatible with a pre-existing data model, or if you want to specify more than one join column, then set joinColumns to one or more instances of JoinColumn (see @JoinColumn).

inverseJoinColumns

Optional


Default: By default, TopLink JPA assumes that there is a single join column on the inverse side of the association. TopLink JPA names this column by concatenating the name of the owned entity + "_" + the name of the referenced primary key column.

If such a column name is awkward, a reserved word, incompatible with a pre-existing data model, or if you want to specify more than one join column, then set joinColumns to one or more instances of JoinColumn (see @JoinColumn)

uniqueConstraints

Optional


Default: empty array of UniqueConstraint.

By default, TopLink JPA assumes that none of the columns in the join table have unique constraints.

If unique constraints do apply to one or more columns in this table, set uniqueContraints to an array of one or more UniqueConstraint instances. For more information, see @UniqueConstraint.


Example 1-43 shows how to use this annotation to specify a join table named EMP_PROJ_EMP for a many-to-many relationship between entities Employee and Project. In the join table, there are two columns: EMP_ID and PROJ_ID. The EMP_ID column contains primary key values from the Employee table whose primary key column (referenced column) is named ID. The PROJ_ID column contains primary key values from the Project table whose primary key column (referenced column) is also named ID.

@Lob

By default, TopLink JPA assumes that all persistent data can be represented as typical database data types.

Use the @Lob annotation with a basic mapping to specify that a persistent property or field should be persisted as a large object to a database-supported large object type.

A Lob may be either a binary or character type. TopLink JPA infers the Lob type from the type of the persistent field or property.

For string and character-based types, the default is Clob. In all other cases, the default is Blob.

You can also use the @Column attribute columnDefinition to further refine the Lob type.

This annotation has no attributes . For more details, see the API.

Example 1-44 shows how to use this annotation to specify that persistent field pic should be persisted as a Blob.

@ManyToMany

By default, TopLink JPA automatically defines a @ManyToMany mapping for a many-valued association with many-to-many multiplicity.

Use the @ManyToMany annotation to:

  • declare the cardinality of the relationship

  • configure the fetch type to EAGER

  • configure the mapping to forbid null values (for non-primitive types) in case null values are inappropriate for your application

  • configure the associated target entity because the Collection used is not defined using generics

  • configure the operations that must be cascaded to the target of the association; for example, if the owning entity is removed, ensure that the target of the association is also removed

Table 1-22 lists the attributes of this annotation . For more details, see the API.

Table 1-22 @ManyToMany Attributes

AttributeRequiredDescription

targetEntity

Optional


Default: the parameterized type of the Collection when defined using generics.

By default, if you are using a Collection defined using generics, then TopLink JPA infers the associated target entity from the type of the object being referenced.

If your Collection does not use generics, then you must specify the entity class that is the target of the association: set the targetEntity element on owning side of the association to the Class of the entity that is the target of the relationship.

cascade

Optional


Default: empty array of CascadeType.

By default, TopLink JPA does not cascade any persistence operations to the target of the association.

If you want some or all persistence operations cascaded to the target of the association, set cascade to one or more CascadeType instances, including:

  • ALL - all possible cascading operations performed on the source entity are cascaded to the target of the association.

  • MERGE - if the source entity is merged, the merge is cascaded to the target of the association.

  • PERSIST - if the source entity is persisted, the persist is cascaded to the target of the association.

  • REFRESH - if the source entity is refreshed, the refresh is cascaded to the target of the association.

  • REMOVE - if the source entity is removed, the target of the association is also removed.

fetch

Optional


Default: FetchType.LAZY.

By default, TopLink JPA uses a fetch type of LAZY: this is a hint to TopLink JPA that data should be fetched lazily when it is first accessed (if possible). For more information, see "TopLink JPA Lazy Loading" in the Oracle Fusion Middleware Oracle TopLink Developer's Guide.

If this is inappropriate for your application or a particular persistent field, set fetch to FetchType.EAGER; this is a requirement on TopLink JPA runtime that data must be eagerly fetched.

mappedBy

Optional


Default: if the relationship is unidirectional, TopLink JPA determines the field that owns the relationship.

If the relationship is bidirectional, then set the mappedBy attribute on the inverse (non-owning) side of the association to the name of the field or property that owns the relationship (as Example 1-46 shows).


Example 1-45 and Example 1-46 show how to use this annotation to configure a many-to-many mapping between Customer and PhoneNumber using generics.

@ManyToOne

By default, TopLink JPA automatically defines a ManyToOne mapping for a single-valued association to another entity class that has many-to-one multiplicity.

Use the @ManyToOne annotation to:

  • configure the fetch type to LAZY

  • configure the mapping to forbid null values (for non-primitive types) in case null values are inappropriate for your application

  • configure the associated target entity if it cannot be inferred from the type of the object being referenced

  • configure the operations that must be cascaded to the target of the association: for example, if the owning entity is removed, ensure that the target of the association is also removed

Table 1-23 lists the attributes of this annotation . For more details, see the API.

Table 1-23 @ManyToOne Attributes

AttributeRequiredDescription

targetEntity

Optional


Default: TopLink JPA infers the associated target entity from the type of the object being referenced

If TopLink JPA cannot infer the type of the target entity, then set the targetEntity element on owning side of the association to the Class of the entity that is the target of the relationship.

cascade

Optional


Default: empty array of CascadeType.

By default, TopLink JPA does not cascade any persistence operations to the target of the association.

If you want some or all persistence operations cascaded to the target of the association, set cascade to one or more CascadeType instances, including:

  • ALL - all possible cascading operations performed on the source entity are cascaded to the target of the association.

  • MERGE - if the source entity is merged, the merge is cascaded to the target of the association.

  • PERSIST - if the source entity is persisted, the persist is cascaded to the target of the association.

  • REFRESH - if the source entity is refreshed, the refresh is cascaded to the target of the association.

  • REMOVE - if the source entity is removed, the target of the association is also removed.

fetch

Optional


Default: FetchType.EAGER.

By default, TopLink JPA uses a fetch type of EAGER; this is a requirement on TopLink JPA runtime that data must be eagerly fetched.

If this is inappropriate for your application or a particular persistent field, set fetch to FetchType.LAZY; this is a hint to TopLink JPA that data should be fetched lazily when it is first accessed (if possible). For more information, see "TopLink JPA Lazy Loading" in the Oracle Fusion Middleware Oracle TopLink Developer's Guide.


Example 1-47 show how to use this annotation to configure a many-to-one mapping between Customer (the owned side) and Order (the owning side) using generics.

@MapKey

By default, TopLink JPA assumes that the primary key of the associated entity is the Map key for associations of type java.util.Map:

Use the @MapKey annotation to:

  • specify some other field or property as the Map key if the primary key of the associated entity is not appropriate for your application

  • specify an embedded composite primary key class (see @EmbeddedId)

The field or property you specify must have a unique constraint (see @UniqueConstraint).

Table 1-24 lists the attributes of this annotation . For more details, see the API.

In Example 1-48, Project owns a one to many relationship to instances of Employee as a Map. Example 1-48 shows how to use the @MapKey annotation to specify that the key for this Map is Employee field empPK, an embedded composite primary key (see Example 1-49) of type EmployeePK (see Example 1-50).

@MappedSuperclass

By default, TopLink JPA assumes that all the persistent fields of an entity are defined in that entity.

Use the @MappedSuperclass annotation to designate a superclass from which your entity class inherits persistent fields. This is a convenient pattern when multiple entity classes share common persistent fields or properties.

You can annotate this superclass's fields and properties with any of the direct and relationship mapping annotations (such as @Basic and @ManyToMany) as you would for an entity but these mappings apply only to its subclasses since no table exists for the superclass itself. The inherited persistent fields or properties belong to the subclass's table.

You can use the @AttributeOverride or @AssociationOverride annotations in the subclass to override the superclass's mapping configuration.

This annotation has no attributes. For more details, see the API.

Example 1-51 shows how to use this annotation to specify Employee as a mapped superclass. Example 1-52 shows how to extend this superclass in an entity and how to use @AttributeOverride in the entity class to override configuration made in the superclass.

@NamedNativeQueries

If you need to specify more than one @NamedNativeQuery, you must specify all your named queries using a single @NamedNativeQueries annotation.

Table 1-25 lists the attributes of this annotation . For more details, see the API.

Example 1-53 shows how to use this annotation to specify two named native queries.

@NamedNativeQuery

In an application that uses TopLink JPA, you can use an entity manager to create and execute queries dynamically or you can pre-define queries and execute them by name at run time.

Use the @NamedNativeQuery annotation to create pre-defined queries associated with an @Entity or @MappedSuperclass that:

If you have more than one @NamedNativeQuery to define, you must use @NamedNativeQueries.

To pre-define portable queries suitable for any database, see @NamedQuery.

Table 1-26 lists the attributes of this annotation . For more details, see the API.

Table 1-26 @NamedNativeQuery Attributes

AttributeRequiredDescription

name

Required


To specify the name of the query, set name to the String name you want.

This is the name by which you invoke the query at runtime (see Example 1-58).

query

Required


To specify the query, set query to the SQL query as a String.

For more information on native SQL query language, see your database documentation.

hints

Optional


Default: empty QueryHint array.

By default TopLink JPA assumes that the SQL query should be executed exactly as given by the query attribute.

To fine-tune the execution of the query, you can optionally set hints to a QueryHint array (see @QueryHint).

resultClass

Optional


To specify a result class, set resultClass to the Class you want. If not specified, then either there is no return type, or it is specified by a ResultSetMapping.

resultSetMapping

Optional


Default: TopLink JPA assumes that the SELECT statement in a native SQL query: returns a single type of entity; includes all the columns that correspond to all the fields or properties of the entity returned; and uses column names that correspond to the field or property names ( AS statements are not used).

To control how TopLink JPA maps the JDBC result set to entity fields or properties and scalars, specify a result set mapping by setting resultSetMapping to the String name of the @SqlResultSetMapping you want.


Example 1-54 shows how to use the @NamedNativeQuery annotation to define a query using SQL native to the underlying database. Example 1-55 shows how you use the EntityManager to acquire this query and use Query method getResultList to execute it.

@NamedQueries

If you need to specify more than one @NamedQuery, you must specify all your named queries using a single @NamedQueries annotation.

Table 1-27 lists the attributes of this annotation . For more details, see the API.

Example 1-56 shows how to use this annotation to specify two named queries.

@NamedQuery

In an application that uses TopLink JPA, you can use an entity manager to create and execute queries dynamically or you can pre-define queries and execute them by name at run time.

Use the @NamedQuery annotation to create pre-defined queries associated with an @Entity or @MappedSuperclass that:

  • use the JPA query language (see Enterprise JavaBeans v3.0 specification, Chapter 4) for portable execution on any underlying database

  • are frequently used

  • are complex and difficult to create

  • can be shared amongst different entities

If you have more than one @NamedQuery to define, you must use @NamedQueries.

To pre-define queries in SQL native to a known, underlying database, see @NamedNativeQuery. Using a native SQL query, you can return entities (including entities of different types), scalar values, or both.

Table 1-28 lists the attributes of this annotation . For more details, see the API.

Example 1-57 shows how to use the @NamedQuery annotation to define a JPA query language query that takes a parameter named firstname. Example 1-58 shows how you use the EntityManager to acquire this query and use Query method setParameter to set the firstname parameter.

@OneToMany

By default, TopLink JPA automatically defines a OneToMany mapping for a many-valued association with one-to-many multiplicity.

Use the @OneToMany annotation to:

Table 1-29 lists the attributes of this annotation . For more details, see the API.

Table 1-29 @OneToMany Attributes

AttributeRequiredDescription

targetEntity

Optional


Default: the parameterized type of the Collection when defined using generics.

By default, if you are using a Collection defined using generics, then TopLink JPA infers the associated target entity from the type of the object being referenced.

If your Collection does not use generics, then you must specify the entity class that is the target of the association; set the targetEntity element on owning side of the association to the Class of the entity that is the target of the relationship.

cascade

Optional


Default: empty array of CascadeType.

By default, TopLink JPA does not cascade any persistence operations to the target of the association.

If you want some or all persistence operations cascaded to the target of the association, set cascade to one or more CascadeType instances, including:

  • ALL - all cascading operations performed on the source entity are cascaded to the target of the association.

  • MERGE - if the source entity is merged, the merge is cascaded to the target of the association.

  • PERSIST - if the source entity is persisted, the persist is cascaded to the target of the association.

  • REFRESH - if the source entity is refreshed, the refresh is cascaded to the target of the association.

  • REMOVE - if the source entity is removed, the target of the association is also removed.

fetch

Optional


Default: FetchType.LAZY.

By default, TopLink JPA uses a fetch type of LAZY; this is a hint to TopLink JPA that data should be fetched lazily when it is first accessed (if possible). For more information, see "TopLink JPA Lazy Loading" in the Oracle Fusion Middleware Oracle TopLink Developer's Guide.

If this is inappropriate for your application or a particular persistent field, set fetch to FetchType.EAGER; this is a requirement on TopLink JPA runtime that data must be eagerly fetched.

mappedBy

Optional


Default: TopLink JPA assumes the relationship is unidirectional.

If the relationship is bidirectional, then set the mappedBy element on the inverse (non-owning) side of the association to the name of the field or property that owns the relationship as Example 1-60 shows.


Example 1-59 and Example 1-60 show how to use this annotation to configure a one-to-many mapping between Customer (the inverse side) and Order (the owning side) using generics.

@OneToOne

By default, TopLink JPA automatically defines a OneToOne mapping for a single-valued association to another entity that has one-to-one multiplicity and infers the associated target entity from the type of the object being referenced.

Use the @OneToOne annotation to:

  • configure the fetch type to LAZY

  • configure the mapping to forbid null values (for non-primitive types) in case null values are inappropriate for your application

  • configure the associated target entity if it cannot be inferred from the type of the object being referenced

  • configure the operations that must be cascaded to the target of the association. For example, if the owning entity is removed, ensure that the target of the association is also removed

Table 1-30 lists the attributes of this annotation . For more details, see the API.

Table 1-30 @OneToOne Attributes

AttributeRequiredDescription

targetEntity

Optional


Default: TopLink JPA infers the associated target entity from the type of the object being referenced.

If TopLink JPA cannot infer the type of the target entity, then set the targetEntity element on owning side of the association to the Class of the entity that is the target of the relationship.

cascade

Optional


Default: empty CascadeType array.

By default, TopLink JPA does not cascade any persistence operations to the target of the association.

If you want some or all persistence operations cascaded to the target of the association, set cascade to one or more CascadeType instances, including:

  • ALL - all cascading operations performed on the source entity are cascaded to the target of the association.

  • MERGE - if the source entity is merged, the merge is cascaded to the target of the association.

  • PERSIST - if the source entity is persisted, the persist is cascaded to the target of the association.

  • REFRESH - if the source entity is refreshed, the refresh is cascaded to the target of the association.

  • REMOVE - if the source entity is removed, the target of the association is also removed.

fetch

Optional


Default: FetchType.EAGER.

By default, TopLink JPA uses a fetch type of EAGER; this is a requirement on TopLink JPA runtime that data must be eagerly fetched.

If this is inappropriate for your application or a particular persistent field, set fetch to FetchType.LAZY; this is a hint to TopLink JPA that data should be fetched lazily when it is first accessed (if possible). For more information, see "TopLink JPA Lazy Loading" in the Oracle Fusion Middleware Oracle TopLink Developer's Guide.

mappedBy

Optional


Default: TopLink JPA assumes the source entity is the owning side of the relationship.

If the source entity does not own the relationship, then set the mappedBy element on the inverse (non-owning) side of the association to the String name of the field or property that owns the relationship as Example 1-62 shows.


Example 1-61 and Example 1-62 show how to use this annotation to configure a one-to-one mapping between Customer (the owning side) and CustomerRecord (the owned side).

@OrderBy

By default, TopLink JPA retrieves the members of a Collection association in ascending order by primary key of the associated entities.

Use the @OrderBy annotation with @OneToMany and @ManyToMany to specify:

  • one or more other field or property names to order by

  • different orders (ascending or descending) for each such field or property

Table 1-31 lists the attributes of this annotation . For more details, see the API.

Example 1-63 shows how to use the @OrderBy annotation to specify that Project method getEmployees should return a List of Employee in ascending order by Employee field lastname and in descending order by Employee field seniority. Example 1-64 shows that by default, Employee method getProjects returns a List in ascending order by Employee primary key empId.

@PersistenceContext

In an application that uses TopLink JPA, you use an entity manager to perform all persistence operations (create, read, update, and delete). A Java EE application obtains an entity manager using dependency injection or direct lookup of the entity manager in the JNDI namespace.

Use the @PersistenceContext annotation in Java EE to obtain an entity manager:

If you have more than one @PersistenceContext to specify, you must use @PersistenceContexts.

Table 1-32 lists the attributes of this annotation . For more details, see the API.

Table 1-32 @PersistenceContext Attributes

AttributeRequiredDescription

name

Optional


Default: TopLink JPA retrieves the default entity manager.

If you want to inject or look up a specific entity manager, set name to the String name of the entity manager you want to use.

For dependency injection, name is not required.

For JNDI look up, name must be set to the name by which the entity manager is to be accessed in the environment referencing context.

unitName

Optional


Default: TopLink JPA retrieves an entity manager for the default persistence unit.

If you want to inject or look up an entity manager associated with a specific persistence unit, set unitName to the String persistence unit name you want. Alternatively, you can use a @PersistenceUnit if you need to obtain an EntityManagerFactory for the persistence unit.

For JNDI look up, if you specify a unitName, then the entity manager accessed by name must be associated with this persistence unit.

type

Optional


Default: PersistenceContextType.TRANSACTION.

By default, TopLink JPA assumes that entity managers are container-managed and the lifetime of their persistence context is scoped to a single transaction. That is, the persistence context comes into existence at the time a transaction is started and ceases to exist when that transaction commits.

Set type to PersistenceContextType.EXTENDED if:

  • your persistence context is application-managed

  • you want the extended persistence context to exist from the time the EntityManager instance is created until it is closed

  • you want the entity manager to maintain references to entity objects after a transaction has committed

  • you want to invoke EntityManager methods persist, remove, merge, and refresh regardless of whether a transaction is active

properties

Optional


Default: TopLink JPA assumes that the entity manager will use default properties.

If you want to configure TopLink JPA properties, including vendor-specific properties, set properties to an array of @PersistenceProperty instances.


Example 1-65 shows how to use this annotation to inject an entity manager in a stateless session bean and Example 1-66 shows how to use this annotation to look up an entity manager in JNDI.

@PersistenceContexts

If you need to specify more than one @PersistenceContext, you must specify all your persistence contexts using a single @PersistenceContexts annotation.

Table 1-33 lists the attributes of this annotation . For more details, see the API.

Example 1-67 shows how to use this annotation to specify two persistence contexts.

@PersistenceProperty

By default, TopLink JPA assumes that the entity manager you obtain using @PersistenceContext will use default properties.

Use the @PersistenceProperty annotation to specify properties, including vendor-specific properties, for the container or TopLink JPA to:

  • customize entity manager behavior

  • exploit specific features

Properties are passed to TopLink JPA when the entity manager is created. Unrecognized properties are simply ignored.

Table 1-34 lists the attributes of this annotation . For more details, see the API.

Example 1-68 shows how to use the @PersistenceProperty annotation to customize the query to take advantage of a JPA extension provided by TopLink JPA. In this case, the property ensures that a full TopLink cache is used in this persistence context. For more information, see "How to Use the Persistence Unit Properties for Caching" in the Oracle Fusion Middleware Oracle TopLink Developer's Guide.

@PersistenceUnit

By default, TopLink JPA uses the EntityManagerFactory associated with the default persistence unit.

Use the @PersistenceUnit annotation to obtain an EntityManagerFactory by lookup or through injection.

If you have more than one @PersistenceUnit to specify, you must use @PersistenceUnits.

Table 1-35 lists the attributes of this annotation . For more details, see the API.

Example 1-69 shows how to use the @PersistenceUnit annotation to specify the JNDI name of the EntityManagerFactory to use and the persistence unit name associated with that factory.

Example 1-70 shows an alternative approach using @PersistenceUnit to inject an EntityManagerFactory.

@PersistenceUnits

If you need to specify more than one @PersistenceUnit, you must specify all your persistence units using a single @PersistenceUnits annotation.

Table 1-36 lists the attributes of this annotation . For more details, see the API.

Example 1-71 shows how to use this annotation to specify two persistence units. In this case, @PersistenceContext attribute unitName and @PersistenceUnit attribute unitName must correspond in order to associate persistence context and persistence unit.

@PrimaryKeyJoinColumn

By default, when one entity extends another using InheritanceType.JOINED (see @Inheritance), TopLink JPA assumes that the foreign key columns of the subclass have the same names as the primary key columns of the primary table of the superclass.

Use the @PrimaryKeyJoinColumn annotation:

  • if the foreign key columns of the subclass do not have the same names as the primary key columns of the primary table of the superclass in this scenario

  • with a @SecondaryTable annotation to join a secondary table to a primary table

  • in a @OneToOne mapping in which the primary key of the referencing entity is used as a foreign key to the referenced entity.

  • to use composite foreign keys (see @PrimaryKeyJoinColumns)

Table 1-37 lists the attributes of this annotation . For more details, see the API.

Table 1-37 @PrimaryKeyJoinColumn Attributes

AttributeRequiredDescription

name

Optional


Default: TopLink JPA assumes one of the following names for the primary key column of the current table (depending on how you are using this annotation):

  • InheritanceType.JOINED (see @Inheritance): the same name as the primary key column of the superclass.

  • @SecondaryTable mapping: the same name as the primary key column of the primary table.

  • @OneToOne mapping: the same name as the primary key column for the table for the referencing entity.

If this name is awkward, a reserved word, incompatible with a pre-existing data model, or invalid as a column name in your database, set name to the String column name you want.

referencedColumnName

Optional


Default: TopLink JPA assumes one of the following names for the name of the primary key column of the table being joined to (depending on how you are using this annotation):

  • InheritanceType.JOINED (see @Inheritance): the same name as the primary key column of the primary table of the superclass.

  • @SecondaryTable mapping: the same name as the name of the primary key column of the primary table.

  • @OneToOne mapping: the same name as the primary key column of the table for the referenced entity.

If this name is awkward, a reserved word, incompatible with a pre-existing data model, or invalid as a column name in your database, set referencedColumnName to the String column name you want.

columnDefinition

Optional


Default: empty String.

By default, TopLink JPA creates a database table column with minimal SQL.

If you want the column created with more specialized options, set columnDefinition to the String SQL fragment that you want TopLink JPA to use when generating the DDL for the column.

Do not use this attribute with a @OneToOne mapping.


Example 1-72 shows an entity base class Customer and Example 1-73 shows how to use @PrimaryKeyJoinColumn to specify primary key join column CUST_ID in the primary table of ValuedCustomer, a subclass of Customer.

@PrimaryKeyJoinColumns

By default, TopLink JPA assumes that each entity has single-column primary key.

Use the @PrimaryKeyJoinColumns annotation if you want to specify a primary key composed of two or more columns.

Table 1-38 lists the attributes of this annotation . For more details, see the API.

Example 1-74 shows how to use this annotation to specify a composite primary key composed of columns CUST_ID and CUST_TYPE.

@QueryHint

By default, TopLink JPA assumes that a @NamedQuery or @NamedNativeQuery should be executed exactly as specified by the query String.

Use the @QueryHint annotation to specify TopLink JPA query extensions to:

  • improve query performance

  • exploit specific TopLink JPA features

Table 1-39 lists the attributes of this annotation . For more details, see the API.

Example 1-75 shows how to use the @QueryHint annotation to customize the query to take advantage of a JPA extension provided by TopLink JPA. In this case, the hint ensures that the TopLink cache is always refreshed when this query is executed. For more information, see "How to Use TopLink JPA Query Hints" in the Oracle Fusion Middleware Oracle TopLink Developer's Guide.

@SecondaryTable

By default, TopLink JPA assumes that all the persistent fields of an entity are stored in a single database table whose name is the entity name. This table is known as the primary table (see @Table).

Use the @SecondaryTable annotation to associate an entity with an additional database table if you want TopLink JPA to persist some of the entity's persistent fields to the primary table and some to other database tables. In this case, you associate an entity's persistent field with a table using the @Column annotation.

If you want to associate two or more secondary tables with an entity, you can use @SecondaryTables.

Table 1-40 lists the attributes of this annotation . For more details, see the API.

Table 1-40 @SecondaryTable Attributes

AttributeRequiredDescription

name

Required


If your entity uses a secondary table, set name to the String table name.

catalog

Optional


Default: TopLink JPA uses whatever the default catalog is for your database.

If the default catalog is inappropriate for your application, set the catalog to the String catalog name to use.

schema

Optional


Default: TopLink JPA uses whatever the default schema is for your database.

If the default schema is inappropriate for your application, set the schema to the String schema name to use.

pkJoinColumns

Optional


Default: TopLink JPA assumes a primary key join column of the same name as the primary key field in the primary table.

If more columns are used for primary key joins in this table, set pkJoinColumns to an array of one or more @PrimaryKeyJoinColumn instances. For more information, see @PrimaryKeyJoinColumn.

uniqueConstraints

Optional


Default: TopLink JPA assumes that there are no additional unique constraints.

If additional unique constraints are applied to columns in this table, set uniqueContraints to an array of one or more @UniqueConstraint instances. For more information, see @UniqueConstraint.


Example 1-76 shows how to use this annotation to specify a secondary table named EMP_HR. In this example, by default, TopLink JPA persists entity persistent field empId to the primary table named Employee in column empId and persists empSalary to the secondary table EMP_HR in column empSalary. For more information, see @Column.

@SecondaryTables

If you need to specify more than one @SecondaryTable, you may specify all your secondary tables using a single @SecondaryTables annotation.

Table 1-41 lists the attributes of this annotation . For more details, see the API.

Example 1-77 shows how to use this annotation to specify two secondary tables named EMP_HR and EMP_TR. In this example, by default, TopLink JPA persists entity persistent field empId to the primary table named EMPLOYEE in column EMP_ID. TopLink JPA persists empSalary to secondary table EMP_HR in column EMP_SAL and empStatus to secondary table EMP_TR in column EMP_STAT. For more information, see @Column.

@SequenceGenerator

If you use the @GeneratedValue annotation to specify a primary key generator of type SEQUENCE, then you can use the @SequenceGenerator annotation to fine tune this primary key generator to:

  • change the allocation size to match your application requirements or database performance parameters

  • change the initial value to match an existing data model (for example, if you are building on an existing data set for which a range of primary key values has already been assigned or reserved)

  • use a pre-defined sequence in an existing data model

Table 1-42 lists the attributes of this annotation . For more details, see the API.

Table 1-42 @SequenceGenerator Attributes

AttributeRequiredDescription

name

Required


The name of the SequenceGenerator must match the generator name in a GeneratedValue with its strategy set to SEQUENCE.

sequenceName

Optional


Default: TopLink JPA assigns a sequence name of its own creation.

If you prefer to use an existing or pre-defined sequence or have a specific requirement for the name of the sequence, set sequenceName to the String name you want.

initialValue

Optional


Default: 0.

By default, TopLink JPA starts all primary key values from 0.

If this does not match an existing data model, set initialValue to the int value you want.

allocationSize

Optional


Default: 50.

By default, TopLink JPA uses an allocation size of 50.

If this allocation size does not match your application requirements or database performance parameters, set allocationSize to the int value you want.


Example 1-78 shows how to use this annotation to specify the allocation size for the SEQUENCE primary key generator named CUST_SEQ.

@SqlResultSetMapping

When you execute a @NamedNativeQuery, it can return entities (including entities of different types), scalar values, or a combination of both.

By default, as Example 1-79 shows, TopLink JPA assumes that the SELECT statement in a native SQL query:

  • returns a single type of entity corresponding to the class argument passed at query creation

  • includes all the columns that correspond to all the fields or properties of the entity returned

  • uses column names that correspond to the field or property names ( AS statements are not used)

Use the @SqlResultSetMapping annotation to control how TopLink JPA maps the JDBC result set to entity fields or properties and scalars if the native SQL query:

  • returns more than one type of entity

  • returns only scalar values or a combination of entities and scalar values

  • uses column aliases ( AS statements)

If you have more than one @SqlResultSetMapping, you must use @SqlResultSetMappings.

Table 1-43 lists the attributes of this annotation . For more details, see the API.

Example 1-80 shows how to use this annotation to include both Order and Item (see Example 1-81) entities in the result list (see Example 1-82). In this case, the result list would be a List of Object arrays like: {[Order, Item], [Order, Item], ...}.

@SqlResultSetMappings

If you need to specify more than one @SqlResultSetMapping, you must specify all your SQL result set mappings using a single @SqlResultSetMappings annotation.

Table 1-44 lists the attributes of this annotation . For more details, see the API.

Example 1-83 shows how to use this annotation to specify two @SqlResultSetMapping instances.

@Table

By default, TopLink JPA assumes that all the persistent fields of an entity are stored in a single database table whose name is the entity name (see @Entity).

Use the @Table annotation to specify the primary table associated with an entity if:

  • the entity name is awkward, a reserved word, incompatible with a pre-existing data model, or invalid as a table name in your database

  • you need to control what catalog or schema the table belongs to

If you want TopLink JPA to persist some fields to the primary table and other fields to one or more secondary tables, see @SecondaryTable.

Table 1-45 lists the attributes of this annotation . For more details, see the API.

Table 1-45 @Table Attributes

AttributeRequiredDescription

name

Optional


Default: TopLink JPA assumes that an entity's database table has the same name as the entity class. In Example 1-84, the default name is Employee.

If the entity class name is awkward, a reserved word, or incompatible with a pre-existing data model, set name to the appropriate database table name. In Example 1-84, TopLink JPA persists the entity class Employee in the database table named EMP.

catalog

Optional


Default: TopLink JPA uses whatever the default catalog is for your database.

If the default catalog is inappropriate for your application, set the catalog to the String catalog name to use.

schema

Optional


Default: TopLink JPA uses whatever the default schema is for your database.

If the default schema is inappropriate for your application, set the schema to the String schema name to use.

uniqueConstraints

Optional


Default: TopLink JPA assumes that no additional columns in the entity's database table have unique constraints.

If additional unique constraints are applied to columns in this table, set uniqueContraints to an array of one or more @UniqueConstraint instances. For more information, see @UniqueConstraint.


Example 1-84 shows how to use this annotation to specify the primary table name.

@TableGenerator

If you use the @GeneratedValue annotation to specify a primary key generator of type TABLE, then you can use the @TableGenerator annotation to fine tune this primary key generator to:

  • set the name of the primary key generator's table because the name is awkward, a reserved word, incompatible with a pre-existing data model, or invalid as a table name in your database

  • change the allocation size to match your application requirements or database performance parameters

  • change the initial value to match an existing data model (for example, if you are building on an existing data set for which a range of primary key values has already been assigned or reserved)

  • configure the primary key generator's table with a specific catalog or schema

  • configure a unique constraint on one or more columns of the primary key generator's table

Table 1-46 lists the attributes of this annotation . For more details, see the API.

Table 1-46 @TableGenerator Attributes

AttributeRequiredDescription

name

Required


The name of the TableGenerator must match the generator name in a GeneratedValue with its strategy set to TABLE. The scope of the generator name is global to the persistence unit (across all generator types).

table

Optional


Default: TopLink JPA provides a suitable name for the table that stores the generated ID values.

If the default table name is inappropriate for your application, set table to the String table name you want.

catalog

Optional


Default: TopLink JPA uses whatever the default catalog is for your database.

If the default catalog is inappropriate for your application, set the catalog to the String catalog name to use.

schema

Optional


Default: TopLink JPA uses whatever the default schema is for your database.

If the default schema is inappropriate for your application, set the schema to the String schema name to use.

pkColumnName

Optional


Default: TopLink JPA provides a name for the primary key column in the generator table.

If this name is inappropriate for your application, set pkColumnName to the String name you want.

valueColumnName

Optional


Default: TopLink JPA provides a suitable name for the column that stores the generated ID values.

If the default column name is inappropriate for your application, set valueColumnName to the String column name you want.

pkColumnValue

Optional


Default: TopLink JPA provides a suitable primary key value for the primary key column in the generator table.

If this value is inappropriate for your application, set pkColumnValue to the String value you want.

initialValue

Optional


Default: 0.

By default, TopLink JPA starts all primary key values from 0.

If this does not match an existing data model, set initialValue to the int value you want.

allocationSize

Optional


Default: 50.

By default, TopLink JPA uses an allocation size of 50.

If this allocation size does not match your application requirements or database performance parameters, set allocationSize to the int value you want.

uniqueConstraints

Optional


Default: TopLink JPA assumes that no additional columns in the primary key generator table have unique constraints.

If additional unique constraints are applied to columns in this table, set uniqueContraints to an array of one or more UniqueConstraint instances. For more information, see @UniqueConstraint.


Example 1-85 shows how to use this annotation to specify the allocation size for the TABLE primary key generator named empGen.

@Temporal

Use the @Temporal annotation to specify the database type that TopLink JPA should persist for persistent fields or properties of type java.util.Date and java.util.Calendar only.

This annotation can be used with @Basic.

Table 1-47 lists the attributes of this annotation . For more details, see the API.

Example 1-86 shows how to use this annotation to specify that TopLink JPA should persist java.util.Date field startDate as a DATE ( java.sql.Date) database type.

@Transient

By default, TopLink JPA assumes that all the fields of an entity are persistent.

Use the @Transient annotation to specify a field or property of an entity that is not persistent, for example, a field or property that is used at run time but that is not part of the entity's state.

TopLink JPA will not persist (or create database schema) for a property or field annotated as @Transient.

This annotation can be used within classes denoted by @Entity, @MappedSuperclass, and @Embeddable.

This annotation has no attributes. For more details, see the API.

Example 1-87 shows how to use this annotation to specify Employee field currentSession as not persistent. TopLink JPA will not persist this field.

@UniqueConstraint

By default, TopLink JPA assumes that only primary key columns are unique and that other columns may contain duplicate values.

Use the @UniqueConstraint annotation to specify that a unique constraint is to be included in the generated DDL for a primary or secondary table. Alternatively, you can specify unique constraints at the column level (see @Column).

Table 1-48 lists the attributes of this annotation . For more details, see the API.

Example 1-88 shows how to use this annotation to specify a unique constraint on columns EMP_BDAY and EMP_NAME in primary table EMP.

@Version

By default, TopLink JPA assumes that the application is responsible for data consistency.

It is recommended that you use the @Version annotation to enable TopLink JPA-managed optimistic locking by specifying the version field or property of an entity class that serves as a holder of its optimistic lock value.

When choosing a version field or property, ensure that:

This annotation has no attributes . For more details, see the API.

Example 1-89 shows how to use this annotation to specify property getVersionNum as the optimistic lock. In this example, the column name for this property is set to OPTLOCK (see @Column) instead of the default column name for the property.

Lifecycle Event Annotations

Use the following lifecycle event annotations to associate a lifecycle event with a callback method if you need to execute custom logic during a lifecycle event:

Figure 1-1 illustrates the relationship amongst the entity lifecycle events that TopLink JPA supports.

You can annotate an entity method directly or you can specify one or more entity listener classes (see @EntityListeners).

If you annotate an entity method directly, then that entity method must meet the following requirements:

  • The entity method must have the following signature:

    public void <MethodName>()
    
  • The entity method can have any method name as long as it does not begin with ejb.

Index of Annotations

Left Curve
Popular Downloads
Right Curve
Untitled Document