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

EclipseLink/Development/JPA2.0/Extended Map support

JPA 2.0 Map Support

Enhancement Request

Issue summary

Map support as defined in JPA 2.0 will require new mapping functionality for EclipseLink. The specification will allow any JPA 1.0 relationship mapping to be stored in a map with key being a primitive, an Embeddable or an Entity. For this support no user defined mapping or property exists on the target of the relationship as is the case in our current support. An additional complication is that the location of the Key fields exist on the relation table if one exists.

The Solution in General

The general approach to implementing this functionality will be to produce Map mappings that encapsulate two EclipseLink mappings. A generated mapping that represents the Key attribute and a user defined mapping that represents the value of the map. It is expected that two Map Mappings will be needed. A Mapping where the Key mapping columns are found in the target table and another where the Key mapping columns are found in the relation table.

The Details

Target Table Map Mapping
Enhancement Request
This support will cover the case where the Map key columns exist in the target table
EclipseLink Mappings Involved
- AggregateCollectionMapping
- Bi-directional OneToMany
- New Uni-directional OneToMany mapping
JPA Mappings
- Bi-directional OneToMany mapping
- Uni-directional OneToMany with @JoinColum
- ElementCollection<*, Primitive> mapping
- ElementCollection<*, Embeddable> mapping
Join Table Map Mapping
Enhancement Request
This support will cover the case where the Map key columns exist in the Join table
EclipseLink Mappings Involved
- ManyToMany mapping
JPA Mappings
- default Uni-directional OneToMany with @JoinColum
- ManyToMany mapping
- Note: The specification disallows both sides of a mapping using a Map collection but there is no technical reason to do this as one side will be read-only anyway.

Use Cases

Both keys and values can be either of the following types: Basic, Embeddable, Entity. This results in the following types of maps.

Basic - Basic

  • Both key and value are a basic
  • Uses a CollectionTable
  • CollectionTable contains three values - foreign key, key and value

Basic - Embeddable

  • Key is a basic, value is Embeddable
  • Uses a CollectionTable
  • Two possible use cases
    • CollectionTable contains - foreign key, key and all attributes of Embeddable
    • CollecitonTable contains - foreign key, and all attributes of Embeddable, Key is made up of attributes of Embeddable

Basic - Entity

  • Key is a basic, value is Entity
  • Several possible use cases
    • No Join Table (bidirectional OneToMany)
      • Key is a Mapped value in Target Entity
      • Value is the Target Entity
      • Target Entity maps join information
    • Join Table with Key
      • Join table contains foreign keys for each side of the relationship and the key
      • Value is the target entity
    • Join Table with Key on Target
      • Join table contains foreign keys for each side of the relationship
      • Value is the target entity
      • Key is a mapped value of on the target entity

Back to the top