TopLink JPA: - Resources - Tutorials - How To's - Examples - Downloads

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

Category Description Annotations

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.

Table 1-2 @AssociationOverride Attributes

Attribute Required Description

name

Required


The name of the field or property defined in the embedded object or mapped superclass.

joinColumns

Required


To specify the join columns that are being mapped to the persistent attribute, set joinColumns to an array of @JoinColumn instances (see @JoinColumn).

The mapping type will remain the same as is defined in the embeddable class or mapped superclass.


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.

Example 1-1 @MappedSuperclass

@MappedSuperclass
public class Employee {
    @Id protected Integer id;
    @ManyToOne protected Address address;
    ...
}

Example 1-2 @AssociationOverride

@Entity
@AssociationOverride(name="address", joinColumns=@JoinColumn(name="ADDR_ID"))
public class PartTimeEmployee extends Employee {
    ...
}

@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.

Table 1-3 @AssociationOverrides Attributes

Attribute Required Description

value

Required


To specify two or more association overrides, set value to an array of @AssociationOverride instances (see @AssociationOverride).


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

Example 1-3 @AssociationOverrides

@Entity
@AssociationOverrides({
    @AssociationOverride(name="address", joinColumns=@JoinColumn(name="ADDR_ID")),
    @AssociationOverride(name="healthPlan", joinColumns=@JoinColumn(name="PLAN_ID"))
})
public class PartTimeEmployee extends Employee {
    ...
}

@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.

Table 1-4 @AttributeOverride Attributes

Attribute Required Description

name

Required


The name of the field or property defined in the embedded object or mapped superclass.

column

Required


The @Column that is being mapped to the persistent attribute. The mapping type will remain the same as is defined in the embeddable class or mapped superclass.


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.

Example 1-4 @MappedSuperclass

@MappedSuperclass
public class Employee {
    @Id protected Integer id;
    ... 
}

Example 1-5 @AttributeOverride

@Entity
@AttributeOverride(name="id", column=@Column(name="PTEMP_ID"))
public class PartTimeEmployee extends Employee {
    ...
}

@AttributeOverrides

If you need to specify more than one @AttributeOverride, you must specify all your attribute overrides using a single @AttributeOverrides annotation.

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

Table 1-5 @AttributeOverrides Attributes

Attribute Required Description

value

Required


To specify two or more attribute overrides, set value to an array of @AttributeOverride instances (see @AttributeOverride).


Example 1-6 shows how to use this annotation to specify two attribute overrides.

Example 1-6 @AttributeOverrides

@Entity
@AttributeOverrides({
    @AttributeOverride(name="id", column=@Column(name="PTEMP_ID")),
    @AttributeOverride(name="salary", column=@Column(name="SAL"))
})
public class PartTimeEmployee extends Employee {
        ... 
}

@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.

Table 1-6 @Basic Attributes

Attribute Required Description

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 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-7 shows how to use this annotation to specify a fetch type of LAZY for a basic mapping.

Example 1-7 @Basic

@Entity
public class Book implements Serializable {
    ...
    @Basic(fetch=LAZY)
    protected String toc; 
    ...
}

@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

Attribute Required Description

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.

Example 1-8 @Column

@Entity
@SecondaryTable(name="EMP_SAL")
public class Employee implements Serializable {
    ...
    @Column(name="SAL", table="EMP_SAL")
    private Long salary;
    ...
}

@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.

Table 1-8 @ColumnResult Attributes

Attribute Required Description

name

Required


Set name to the String equivalent of a column name in the SELECT statement of a native SQL query. If you use a column alias (AS statement) in the SELECT, then set name to the column alias.


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"], ...}.

Example 1-9 Order Entity With @ColumnResult

@SqlResultSetMapping(
    name="OrderResults",
    entities={
        @EntityResult(
            entityClass=Order.class, 
            fields={
                @FieldResult(name="id",       column="order_id"),
                @FieldResult(name="quantity", column="order_quantity"),
                @FieldResult(name="item",     column="order_item")
            }
        )
    },
    columns={
        @ColumnResult(
            name="item_name"
        )
    }
)
@Entity
public class Order {
    @Id
    protected int id;
    protected long quantity;
    @ManyToOne(fetch=LAZY)
    protected Item item;
    ...
}

Example 1-10 Item Entity

@Entity
public class Item {
    @Id
    protected int id;
    protected String name;
    ...
}

Example 1-11 Native Query Using an @SqlResultSetMapping With an @ColumnResult

Query q = entityManager.createNativeQuery(
    "SELECT o.id       AS order_id, " +
           "o.quantity AS order_quantity, " +
           "o.item     AS order_item, " + 
           "i.name     AS item_name " +
    "FROM Order o, Item i " +
    "WHERE (order_quantity > 25) AND (order_item = i.id)",
    "OrderResults"
);

List resultList = q.getResultList(); 
// List of Object arrays: {[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:

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

Table 1-9 @DiscriminatorColumn Attributes

Attribute Required Description

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.

Example 1-12 @DiscriminatorColumn and @DiscriminatorValue

@Entity
@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(name="DISC", discriminatorType=STRING, length=20)
@DiscriminatorValue(value-"CUST")
public class Customer {
    ... 
}
@Entity
@DiscriminatorValue("VIP")
public class ValuedCustomer extends Customer { 
    ... 
}

@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:

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

Table 1-10 @DiscriminatorValue Attributes

Attribute Required Description

value

Required


Set value to the String equivalent of a discriminator value that conforms to the @DiscriminatorColumn attributes discriminatorType and length.


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.

Example 1-13 @DiscriminatorColumn and @DiscriminatorValue

@Entity
@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(name="DISC", discriminatorType=STRING, length=20)
@DiscriminatorValue("CUST")
public class Customer {
    ... 
}

@Entity
@DiscriminatorValue("VIP")
public class ValuedCustomer extends Customer { 
    ... 
}

@Embeddable

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

Use the @Embeddable annotation to specify a class whose instances are stored as an intrinsic part of an 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 entity.

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

Example 1-14 shows how to use this annotation to specify that class EmploymentPeriod may be embedded in an entity when used as the type for a persistent field annotated as @Embedded (see Example 1-15).

Example 1-14 @Embeddable

@Embeddable
public class EmploymentPeriod {
    java.sql.Date startDate;
    java.sql.Date endDate;
    ...
}

@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.

Example 1-15 @Embedded

@Entity
public class Employee implements Serializable {
    ...
    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name="startDate", column=@Column(name="EMP_START")),
        @AttributeOverride(name="endDate", column=@Column(name="EMP_END"))
    )
    public EmploymentPeriod getEmploymentPeriod() { 
        ... 
    }
    ...
}

@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:

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.

Example 1-16 Embeddable Composite Primary Key Class

@Embeddable
public class EmployeePK implements Serializable {
    private String name;
    private long id;

    public EmployeePK() { }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public int hashCode() {
        return (int) name.hashCode() + id;
    }

    public boolean equals(Object obj) {
        if (obj == this) return true;
        if (obj == null) return false;
        if (!(obj instanceof EmployeePK)) return false;
        EmployeePK pk = (EmployeePK) obj;
        return pk.id == id && pk.name.equals(name);
    }
}

Example 1-17 @EmbeddedId

@Entity
public class Employee implements Serializable {
    EmployeePK primaryKey;
 
    public Employee() { }
 
    @EmbeddedId
    public EmployeePK getPrimaryKey() {
        return primaryKey;
    }
 
    public void setPrimaryKey(EmployeePK pk) {
        primaryKey = pk;
    }
 
    ...
}

@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.

Table 1-11 @Entity Attributes

Attribute Required Description

name

Optional


Default: TopLink JPA assumes that the name of the entity is the unqualified name of the entity class. In Example 1-18, the default name is "Employee".

If the entity class name is awkward, a reserved word, incompatible with a pre-existing data model, or invalid as a table name in your database, set name to an alternative String value.


Example 1-18 shows how to use this annotation.

Example 1-18 @Entity

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

@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:

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:

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.

Table 1-12 @EntityListeners Attributes

Attribute Required Description

value

Required


To specify the list of entity listener classes for an @Entity or @MappedSuperclass, set value to a Class array of entity listener classes.


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.

Example 1-19 @EntityListeners

@Entity
@EntityListeners({EmployeePersistListener.class, EmployeeRemoveListener.class})
public class Employee implements Serializable {
    ...
}

Example 1-20 EmployeePersistListener

public class EmployeePersistListener {
    @PostPersist
    @PostLoad
    public void employeePersist(Object employee) {
    ...
    }
    ...
}

Example 1-21 EmployeeRemoveListener

public class EmployeeRemoveListener {
    @PreRemove
    public void employeePreRemove(Object employee) {
    ...
    }
    ...
}

@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

Attribute Required Description

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], ...}.

Example 1-22 Order Entity With @EntityResult

@SqlResultSetMapping(
    name="OrderResults",
    entities={
        @EntityResult(
            entityClass=Order.class, 
            fields={
                @FieldResult(name="id",       column="order_id"),
                @FieldResult(name="quantity", column="order_quantity"),
                @FieldResult(name="item",     column="order_item")
            }
        ),
        @EntityResult(
            entityClass=Item.class,
            fields={
                @FieldResult(name="id",       column="item_id"),
                @FieldResult(name="name",     column="item_name")
            }
        )
    }
)
@Entity
public class Order {
    @Id
    protected int id;
    protected long quantity;
    @ManyToOne
    protected Item item;
    ...
}

Example 1-23 Item Entity

@Entity
public class Item {
    @Id
    protected int id;
    protected String name;
    ...
}

Example 1-24 Native Query Using an @SqlResultSetMapping With an @EntityResult

Query q = entityManager.createNativeQuery(
    "SELECT o.id       AS order_id, " +
           "o.quantity AS order_quantity, " +
           "o.item     AS order_item, " + 
           "i.id       AS item_id, " +
           "i.name     AS item_name " +
    "FROM Order o, Item i " +
    "WHERE (order_quantity > 25) AND (order_item = i.id)"
    "OrderResults"
);

List resultList = q.getResultList(); 
// List of Object arrays: {[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.

Table 1-14 @Enumerated Attributes

Attribute Required Description

value

Optional


Default: EnumType.ORDINAL.

By default, TopLink JPA assumes that for a property or field mapped to an enumerated constant, the ordinal value should be persisted. In Example 1-26, the ordinal value of EmployeeStatus is written to the database when Employee is persisted.

If you want the String value of the enumerated constant persisted, set value to EnumType.STRING.


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.

Example 1-25 Enumerated Constants

public enum EmployeeStatus {FULL_TIME, PART_TIME, CONTRACT}
public enum SalaryRate {JUNIOR, SENIOR, MANAGER, EXECUTIVE}

Example 1-26 @Enumerated

@Entity 
public class Employee {
    ...
    public EmployeeStatus getStatus() {
    ...
    }

    @Enumerated(STRING)
    public SalaryRate getPayScale() {
    ...
    }
    ...
}

@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.

Example 1-27 @ExcludeDefaultListeners

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

@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.

Example 1-28 Entity Listeners at the Superclass Level

@MappedSuperclass
@EntityListeners({EmployeeListener.class})
public class Employee {
    ... 
}

Example 1-29 @ExcludeSuperclassListeners at the Subclass Level

@Entity
@ExcludeSuperclassListeners
@EntityListeners({PartTimeEmployeeListener1.class, PartTimeEmployeeListener2.class})
public class PartTimeEmployee extends Employee {
    ...
}

@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.

Table 1-15 @FieldResult Attributes

Attribute Required Description

name

Required


Set name to the entity's field or property name (as a String) that corresponds to the column name specified by the column attribute.

column

Required


Set column to the String name of the column used in the SELECT statement. If you use a column alias (AS statement) in the SELECT, then set column to the column alias.


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], ...}.

Example 1-30 Order Entity With @EntityResult and @FieldResult

@SqlResultSetMapping(
    name="OrderResults",
    entities={
        @EntityResult(
            entityClass=Order.class, 
            fields={
                @FieldResult(name="id",       column="order_id"),
                @FieldResult(name="quantity", column="order_quantity"),
                @FieldResult(name="item",     column="order_item")
            }
        ),
        @EntityResult(
            entityClass=Item.class,
            fields={
                @FieldResult(name="id",       column="item_id"),
                @FieldResult(name="name",     column="item_name")
            }
        )
    }
)
@Entity
public class Order {
    @Id
    protected int id;
    protected long quantity;
    @ManyToOne
    protected Item item;
    ...
}

Example 1-31 Item Entity

@Entity
public class Item {
    @Id
    protected int id;
    protected String name;
    ...
}

Example 1-32 Native Query Using an @SqlResultSetMapping With an @EntityResult

Query q = entityManager.createNativeQuery(
    "SELECT o.id       AS order_id, " +
           "o.quantity AS order_quantity, " +
           "o.item     AS order_item, " + 
           "i.id       AS item_id, " +
           "i.name     AS item_name " +
    "FROM Order o, Item i " +
    "WHERE (order_quantity > 25) AND (order_item = i.id)",
    "OrderResults"
);

List resultList = q.getResultList(); 
// List of Object arrays: {[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

Attribute Required Description

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.

Example 1-33 @GeneratedValue

@Entity
public class Employee implements Serializable {
    ...
    @Id
    @GeneratedValue(strategy=SEQUENCE, generator="CUST_SEQ")
    @Column(name="CUST_ID")
    public Long getId() { 
        return id; 
    }
    ...
}

@Id

Use the @Id annotation to designate one or more persistent fields or properties as the entity's primary key.

For each entity, you must designate at least one of the following:

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

Example 1-34 shows how to use this annotation to designate persistent field empID as the primary key of the Employee table.

Example 1-34 @Id

@Entity
public class Employee implements Serializable {
    @Id
    private int empID;
    ...
}

@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.

Table 1-17 @IdClass Attributes

Attribute Required Description

value

Required


To specify a composite primary key class, set value to the Class you want.


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.

Example 1-35 Non-Embedded Composite Primary Key Class

public class EmployeePK implements Serializable
{
    private String empName;
    private Date birthDay;

    public EmployeePK() { }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String name) {
        empName = name;
    }

    public Date getBirthDay() {
        return birthDay;
    }

    public void setBirthDay(Date date) {
        birthDay = date;
    }

    public int hashCode() {
        return (int) empName.hashCode();
    }

    public boolean equals(Object obj) {
        if (obj == this) return true;
        if (obj == null) return false;
        if (!(obj instanceof EmployeePK)) return false;
        EmployeePK pk = (EmployeePK) obj;
        return pk.birthDay == birthDay && pk.empName.equals(empName);
    }
}

Example 1-36 @IdClass

@IdClass(EmployeePK.class)
@Entity
public class Employee {
    @Id String empName;
    @Id Date birthDay;
...
}

@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

Attribute Required Description

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_TABLEFoot 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.

Example 1-37 @Inheritance - Root Class Using JOINED

@Entity@Inheritance(strategy=JOINED)public class Customer { 
    @Id
    private int customerId;
    ... 
}

Example 1-38 @Inheritance - Subclass Using JOINED

@Entity
public class ValuedCustomer extends Customer { 
    ... 
}

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.

Example 1-39 @Inheritance - Root Class Specifying its Discriminator Column

@Entity
@DiscriminatorColumn(discriminatorType=DiscriminatorType.INTEGER)
@DiscriminatorValue("1")
public class Customer { 
    ... 
}

Example 1-40 @Inheritance - Subclass Specifying its Discriminator Value

@Entity
@DiscriminatorValue("2")
public class ValuedCustomer extends Customer { 
    ... 
}

@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

Attribute Required Description

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.

Example 1-41 @JoinColumn

@Entity
public class Employee implements Serializable {
    ...
    @ManyToOne
    @JoinColumn(name="ADDR_ID")
    public Address getAddress() {
        return address;
    }
}

@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.

Table 1-20 @JoinColumns Attributes

Attribute Required Description

value

Required


To specify two or more join columns, set value to an array of JoinColumn instances (see @JoinColumn).


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.

Example 1-42 @JoinColumns

@Entity
public class Employee implements Serializable {
    ...
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="ADDR_ID", referencedColumnName="ID"),
        @JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP")
    })
    public Address getAddress() { 
        return address; 
    }
    ...
}

@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:

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

Table 1-21 @JoinTable Attributes

Attribute Required Description

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.

Example 1-43 @JoinTable

@Entity
public class Employee implements Serializable {
    ...
    @ManyToMany
    @JoinTable(
        name="PROJ_EMP",
        joinColumns=@JoinColumn(name="EMP_ID", referencedColumnName="ID"),
        inverseJoinColumns=@JoinColumn(name="PROJ_ID", referencedColumnName="ID")
    )
    public Collection getProjects() {
        return projects;
    }
    ...
}

@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.

Example 1-44 @Lob

@Entity
public class Employee implements Serializable {
    ...
    @Lob 
    @Basic(fetch=LAZY)
    @Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
    protected byte[] pic;
    ...
}

@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:

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

Table 1-22 @ManyToMany Attributes

Attribute Required Description

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.