Jump to: navigation, search

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

(Flex Extensions)
(Flex Extensions)
Line 45: Line 45:
  
 
<source lang="java">
 
<source lang="java">
    @Transient
+
@Transient
 
      
 
      
    @FlexExtensions(initial=2, create=false)
+
@FlexExtensions(initial=2, create=false)
    private Map<String, Object> extensions = new HashMap<String, Object>();
+
private Map<String, Object> extensions = new HashMap<String, Object>();
 
</source>
 
</source>
 +
 +
''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:
 
The underlying schema for the extension storage would look like:

Revision as of 11:39, 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

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"); 
    }
}