Java SDK

Standard JPA Annotations

JPA annotations enable you to define how the JPA provider persists your Java class.

Note: You can associate an annotation with each field or the getter method for the field. You must be consistent within a class by using one approach or the other. If you add one annotation to a field and another to a getter method, an error occurs. We recommend that you annotate the field instead of the getter method.

The JPA 2.0 specification (JSR 317) lists all standard JPA annotations. JPA 2.0 Specification Support lists the areas of the JPA 2.0 specification that are supported by the JPA provider and how differs from the standard JPA specification.

Some common standard JPA annotations are:


Marks a Java class as persistent. Each Java class must include an @Entity annotation.

When you start up your application, each class that's annotated with @Entity is loaded and synchronized with For more details, see schema creation and schema deletion properties.

For sample syntax for standard and custom entities, see @Table.

The optional name attribute in @Entity specifies the entity name. If the name attribute is not specified, the entity name defaults to the unqualified name of the entity class. If the name attribute is specified, you use the name to refer to the entity in JPQL queries.

Note: The value for the name attribute in @Entity doesn't have to match the value for the name attribute in @Table.


Explicitly declares a field in a class as persistent. To make a field in a class persistent, its type must either be one that is persisted by default or you must explicitly declare it as persistent by using the @Basic annotation. The DataNucleus documentation lists a table of common Java data types and indicates whether each is persisted by default.


Indicates that the identity value is generated by the database. This is mostly used for primary keys. Only the GenerationType.IDENTITY strategy is supported.


Marks a field to use for the identity (primary key) of the class. entities always have a primary key. The JPA provider doesn't support all JPA standard primary types. For more information, see Primary Keys.


Specifies an existing entity (object) name. The name attribute in @Table must match the underlying type; for example, User or MyCustomObject__c.

This is a sample for a standard User entity:

public class User {

Note: If you omit the @Table(name="User") annotation, the User class maps to a custom User__c entity instead of the standard User entity.

This is a sample for a custom MyCustomObject__c entity:

public class MyCustomObject {


Defines a field as holding the version for the class.

For information on usage of the @ManyToOne and @OneToMany annotations, see Relationship Fields.

Required and Unique Fields

Use the @Column standard annotation to mark fields as required or unique.

Required Fields

Use a @Column(nullable = false) annotation to mark a field as required.

Unique Fields

Use a @Column(unique = true) annotation to mark a field as unique. We recommend that you mark unique fields to be required too.

Note: The @UniqueConstraint annotation is not supported.

Sample Class Using Standard Annotations

The following sample Java class uses standard JPA annotations.

import java.util.Date;
import javax.persistence.*;

public class Student
    String id;

    // Explicitly marked as persistent. This is not necessary as String
    // fields are persisted by default
    private String firstName;

    // No annotation but String fields are persisted by default
    private String lastName;

    // No annotation but String fields are persisted by default
    private String email;

    // No annotation but Date fields are persisted by default
    private Date dateOfBirth;

    // getters and setters
    public String getId() {
        return id;

    public String getFirstName() {
        return firstName;
    public void setFirstName(String firstName) {
        this.firstName = firstName;

    public String getLastName() {
        return lastName;
    public void setLastName(String lastName) {
        this.lastName = lastName;

    public String getEmail() {
        return email;
    public void setEmail(String email) { = email;

    public Date getDateOfBirth() {
        return dateOfBirth;
    public void setDateOfBirth(Date dateOfBirth) {
        this.dateOfBirth = dateOfBirth;