Jump to: navigation, search

Difference between revisions of "EclipseLink/Examples/JPA/Extensible"

(Flex Extensions)
(Usage Instructions)
Line 18: Line 18:
  
 
=== Usage Instructions ===
 
=== Usage Instructions ===
 +
 +
# Download the example project from SVN
 +
# Configure project within your Eclipse development environment with necessary library dependencies
 +
#* EclipseLink 2.2
 +
#* JDBC Driver
 +
#* JUnit
 +
# Configure database usage with PU properties
 +
# Run examples and/or test cases
  
 
=== Code Examples ===
 
=== Code Examples ===

Revision as of 11:41, 2 March 2011

Catnicon.gifUNDER CONSTRUCTION

Extensible Entities Example

This example illustrates how EclipseLink 2.2 can be used to build a domain model that allows addition 'extension' properties, relationships, and types to added and used in the application.

NOTE: This functionality is being formalized into new features for EclipseLink Indigo (2.3) in its Extensibility features.

Getting the Code

The example is being developed within the trunk of EclipseLink:

Usage Instructions

  1. Download the example project from SVN
  2. Configure project within your Eclipse development environment with necessary library dependencies
    • EclipseLink 2.2
    • JDBC Driver
    • JUnit
  3. Configure database usage with PU properties
  4. Run examples and/or test cases

Code Examples

The following are code snippets extracted from the example to illustrate key use-cases.

Values Extensions

Values extensions use a separate table to store the extension properties. In this example the Employee entity type uses values extensions and is configured as:

    @Transient
 
    @ValuesExtensions(table = @Table(name = "emp_ext"), 
            id = @Column(name = "EXT_ID"), 
            value = @Column(name = "EXT_VALUE"))
    private Map<String, Object> extensions;

It is annotated as @Transient so that the default JPA mappings are not applied. The configuration section below shows how the mapping is actually enabled.

El-values-extensions-schema.gif

Flex Extensions

In this example the Address class uses flex extensions and is configured as:

@Transient
 
@FlexExtensions(initial=2, create=false)
private Map<String, Object> extensions = new HashMap<String, Object>();

Note: The mapping must be @Transient to avoid the default mappings being applied. The confiuration section below shows how the mapping will be enabled.

The underlying schema for the extension storage would look like:

El-flex-extensions-schema.gif

Configuration

In order to enable the extensions a session customizer is used. This will use the ExtensionManagerHelper to enable extensions usage in the specified classes.

src/model.extensions.ExtensionsCustomizer

public class ExtensionsCustomizer implements SessionCustomizer {
 
    public void customize(Session session) throws Exception {
        ExtensionManagerHelper helper = new ExtensionManagerHelper(session);
 
        helper.initializeValueExtensions(Employee.class, "extensions"); 
        helper.initializeFlexExtensions(Address.class, "extensions"); 
    }
}