The datastore's representation of a reference to an instance (either a class or interface reference) depends on the identity type defined for the reference's class. The class's identity type determines the primary-key (or unique-key) columns of the class's table. In addition, a class may be mapped to one or more tables. A Java reference is represented in the datastore by a foreign key that refers to the tables associated with the class of the reference. For example, Example 5-1 defined the Movie table. Example 5-2 defines a Role table for the Role class in the com.mediamania.content package. The Role class has a reference, named movie, to the Movie class. On line , the Role table defines a foreign key to reference the primary key of the Movie table.
CREATE TABLE Role ( oid INTEGER, name VARCHAR(20), movie INTEGER, PRIMARY KEY(oid), FOREIGN KEY(movie) REFERENCES Movie(oid)  )
Your application does not have to deal with primary and foreign keys; it simply uses standard Java syntax, using the reference to access the object in memory. You also do not need to specify anything specific in the metadata for a reference; its declaration in Java provides all of the necessary information.
JDO supports Java's polymorphism, allowing a reference to refer to an instance of any subclass of the reference's declared class. A JDO implementation must be able to determine the type of the instance being referred to, so that it can access the right table (or tables). Implementations employ various techniques to store this type information. With some inheritance-mapping approaches, the implementation requires a type-discriminator column to identify the type of an instance. Most implementations allow you to specify the name for the type-discriminator column.