Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "EclipseLink/UserGuide/JPA/Basic JPA Development/Entities/MappedSuperclass"

(@MappedSuperclass)
Line 70: Line 70:
 
{{EclipseLink_Spec|section=Section 11.1.2 "AssociationOverride Annotation"}}
 
{{EclipseLink_Spec|section=Section 11.1.2 "AssociationOverride Annotation"}}
  
The following examples shows usages of the three different inheritance strategies for mapping an <code>Account</code> hierarchy.
+
The following example shows usages of a generic persistence mapped superclass.
  
<span id="Example: @Inheritance"></span>
+
<span id="Example: @MappedSuperClass"></span>
======''Example: Using <code>SINGLE_TABLE</code> with @Inheritance annotation''======
+
======''Example: Using @MappedSuperClass annotation''======
<source lang="SQL">
+
create table ACCOUNT (ID NUMBER, ACCOUNT_TYPE VARCHAR(31), BALANCE NUMBER, INTERESTRATE NUMBER, RETURNCHECKS BOOLEAN)
+
</source>
+
  
 
<source lang="java">
 
<source lang="java">
@Entity
+
@MappedSuperclass
@Table(name="ACCOUNT")
+
public abstract class PersistentObject implements Serializable {
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
+
@DiscriminatorColumn(name="ACCOUNT_TYPE")
+
public abstract class Account implements Serializable {
+
 
     @Id
 
     @Id
 
     private Long id;
 
     private Long id;
     @Basic
+
     @Version
     private BigDecimal balance;
+
     private Long version;
 
     ...
 
     ...
 
}
 
}
Line 94: Line 88:
 
<source lang="java">
 
<source lang="java">
 
@Entity
 
@Entity
@DiscriminatorValue("SAVINGS")
+
@Table("EMP")
public class SavingAccount extends Account {
+
public class Employee extends PersistentObject {
 
     @Basic
 
     @Basic
     private BigDecimal interestRate;
+
     private String name;
 +
    ...
 
}
 
}
 
</source>
 
</source>
Line 103: Line 98:
 
<source lang="java">
 
<source lang="java">
 
@Entity
 
@Entity
@DiscriminatorValue("CHECKING")
+
@Table("PROJECT")
public class CheckingAccount extends Account {
+
@AttributeOverride(name="id" column=@Column(name="PROJ_ID"))
 +
public class Project extends PersistentObject {
 
     @Basic
 
     @Basic
     private boolean returnChecks;
+
     private String name;
 +
    ...
 
}
 
}
 
</source>
 
</source>
Line 113: Line 110:
  
 
<source lang="xml">
 
<source lang="xml">
<entity class="Account">
+
<mapped-superclass class="PersistentObject">
    <table name="ACCOUNT"/>
+
    <inheritance strategy="SINGLE_TABLE"/>
+
    <discriminator-column name="ACCOUNT_TYPE"/>
+
 
     <attributes>
 
     <attributes>
 
         <id name="id"/>
 
         <id name="id"/>
         <basic name="balance"/>
+
         <version name="version"/>
 
     </attributes>
 
     </attributes>
</entity>
+
</mapped-superclass>
</source>
+
<entity class="Employee">
<source lang="xml">
+
    <table name="EMP">
 
+
<entity class="SavingAccount">
+
    <discriminator-value>SAVINGS</discriminator-value>
+
 
     <attributes>
 
     <attributes>
         <basic name="interestRate"/>
+
         <basic name="name"/>
 +
        ...
 
     </attributes>
 
     </attributes>
 
</entity>
 
</entity>
</source>
+
<entity class="Project">
 
+
    <table name="PROJECT">
<source lang="xml">
+
    <attribute-override name="id">
<entity class="CheckingAccount">
+
        <column name="PROJ_ID"/>
    <discriminator-value>CHECKING</discriminator-value>
+
    </attribute-override>
 
     <attributes>
 
     <attributes>
         <basic name="returnChecks"/>
+
         ...
 
     </attributes>
 
     </attributes>
 
</entity>
 
</entity>

Revision as of 15:36, 21 July 2011

EclipseLink JPA


@MappedSuperclass

You can use the @MappedSuperclass annotation or <mapped-superclass> XML element to define mappings for an abstract or non-persistent superclass, that are inherited by its subclass entities. A mapped superclass is a special type of class that is not persistent itself, but has subclasses that are persistent. A mapped superclass is useful for defined a common persistence superclass that defines common behavior across a set of classes, such as an id or version attribute. A mapped superclass should normally be abstract but is not required to be, but cannot have any persistent instances.

Mapped superclasses cannot define a table, but can define mapping for its attributes and other common persistence behavior. Entities cannot have relatinoships to mapped superclasses, and mapped superclasses cannot be queried.

The @MappedSuperclass annotation does not have any attributes.

Elug javaspec icon.gif

For more information, see Section 2.1.9 "Inheritance" in the JPA Specification.

Elug javaspec icon.gif

For more information, see Section 11.1.34 "MappedSuperclass Annotation" in the JPA Specification.

@AttributeOverride

You can use the @AttributeOverride and @AttributeOverrides annotations, or <attribute-override> XML element to override the column for a basic attribute in a mapped superclass. This allows for the column name to be different in each subclass.

@AttributeOverride Attributes
Attribute Description Default Required?
name The name of the attribute. Yes
column The column in the subclass table. column defined in mapped superclass No
Elug javaspec icon.gif

For more information, see Section 11.1.4 "AttributeOverride Annotation" in the JPA Specification.

@AssociationOverride

You can use the @AssociationOverride and @AssociationOverrides annotations, or <association-override> XML element to override the join column or join table for a relationship attribute in a mapped superclass. This allows for the join column name or join table to be different in each subclass.

@AssociationOverrideAttributes
Attribute Description Default Required?
name The name of the attribute. Yes
joinColumn The join column in the subclass table. join column defined in mapped superclass No
joinTable The join table for the subclass. join table defined in mapped superclass No
Elug javaspec icon.gif

For more information, see Section 11.1.2 "AssociationOverride Annotation" in the JPA Specification.

The following example shows usages of a generic persistence mapped superclass.

Example: Using @MappedSuperClass annotation
@MappedSuperclass
public abstract class PersistentObject implements Serializable {
    @Id
    private Long id;
    @Version
    private Long version;
    ...
}
@Entity
@Table("EMP")
public class Employee extends PersistentObject {
    @Basic
    private String name;
    ...
}
@Entity
@Table("PROJECT")
@AttributeOverride(name="id" column=@Column(name="PROJ_ID"))
public class Project extends PersistentObject {
    @Basic
    private String name;
    ...
}
Example: Using SINGLE_TABLE with <inheritance> XML
<mapped-superclass class="PersistentObject">
    <attributes>
        <id name="id"/>
        <version name="version"/>
    </attributes>
</mapped-superclass>
<entity class="Employee">
    <table name="EMP">
    <attributes>
        <basic name="name"/>
        ...
    </attributes>
</entity>
<entity class="Project">
    <table name="PROJECT">
    <attribute-override name="id">
        <column name="PROJ_ID"/>
    </attribute-override>
    <attributes>
        ...
    </attributes>
</entity>


Eclipselink-logo.gif
Version: 2.2.0 DRAFT
Other versions...

Back to the top