Class DirectMapMapping

All Implemented Interfaces:
Serializable, Cloneable, ContainerMapping, MapComponentMapping, RelationalMapping

public class DirectMapMapping extends DirectCollectionMapping implements MapComponentMapping
Mapping for a collection of key-value pairs. The key and value must be simple types (String, Number, Date, etc.) and stored in a single table along with a foreign key to the source object. A converter can be used on the key and value if the desired object types do not match the data types.
Since:
TopLink 3.5
See Also:
  • Constructor Details

    • DirectMapMapping

      public DirectMapMapping()
      DirectMapCollectionMapping constructor
  • Method Details

    • setContainerPolicy

      public void setContainerPolicy(ContainerPolicy containerPolicy)
      ADVANCED: Configure the mapping to use a container policy. This must be a MappedKeyMapContainerPolicy policy. Set the valueMapping for the policy.
      Specified by:
      setContainerPolicy in interface ContainerMapping
      Overrides:
      setContainerPolicy in class DirectCollectionMapping
    • getKeyConverter

      public Converter getKeyConverter()
      PUBLIC: Return the converter on the mapping. A converter can be used to convert between the key's object value and database value.
    • setKeyConverter

      public void setKeyConverter(Converter keyConverter)
      PUBLIC: Set the converter on the mapping. A converter can be used to convert between the key's object value and database value.
    • setKeyConverterClassName

      public void setKeyConverterClassName(String keyConverterClassName)
      INTERNAL: Set the converter class name on the mapping. Initialized in convertClassNamesToClasses. A converter can be used to convert between the key's object value and database value.
    • addToCollectionChangeRecord

      public void addToCollectionChangeRecord(Object newKey, Object newValue, ObjectChangeSet objectChangeSet, UnitOfWorkImpl uow) throws DescriptorException
      INTERNAL: Add a new value and its change set to the collection change record. This is used by attribute change tracking. If a value has changed then issue a remove first with the key then an add.
      Throws:
      DescriptorException
    • buildCloneForPartObject

      public Object buildCloneForPartObject(Object attributeValue, Object original, CacheKey cacheKey, Object clone, AbstractSession cloningSession, Integer refreshCascade, boolean isExisting, boolean isFromSharedCache)
      INTERNAL: Require for cloning, the part must be cloned. Ignore the objects, use the attribute value.
      Overrides:
      buildCloneForPartObject in class CollectionMapping
      Parameters:
      attributeValue - TODO
      original - TODO
      cacheKey - TODO
      clone - TODO
      cloningSession - TODO
      refreshCascade - TODO
      isExisting - TODO
      isFromSharedCache - TODO
      Returns:
      TODO
    • calculateDeferredChanges

      public void calculateDeferredChanges(ChangeRecord changeRecord, AbstractSession session)
      INTERNAL: Used by AttributeLevelChangeTracking to update a changeRecord with calculated changes as opposed to detected changes. If an attribute can not be change tracked it's changes can be detected through this process.
      Overrides:
      calculateDeferredChanges in class DirectCollectionMapping
      Parameters:
      changeRecord - TODO
      session - TODO
    • cascadeDiscoverAndPersistUnregisteredNewObjects

      public void cascadeDiscoverAndPersistUnregisteredNewObjects(Object object, Map newObjects, Map unregisteredExistingObjects, Map visitedObjects, UnitOfWorkImpl uow, Set cascadeErrors)
      INTERNAL: Cascade discover and persist new objects during commit.
      Overrides:
      cascadeDiscoverAndPersistUnregisteredNewObjects in class DirectCollectionMapping
      Parameters:
      object - TODO
      newObjects - TODO
      unregisteredExistingObjects - TODO
      visitedObjects - TODO
      uow - TODO
      cascadeErrors - TODO
    • cascadePerformRemoveIfRequired

      public void cascadePerformRemoveIfRequired(Object object, UnitOfWorkImpl uow, Map visitedObjects)
      INTERNAL: Cascade perform delete through mappings that require the cascade
      Overrides:
      cascadePerformRemoveIfRequired in class DirectCollectionMapping
      Parameters:
      object - TODO
      uow - TODO
      visitedObjects - TODO
    • cascadeRegisterNewIfRequired

      public void cascadeRegisterNewIfRequired(Object object, UnitOfWorkImpl uow, Map visitedObjects)
      INTERNAL: Cascade registerNew for Create through mappings that require the cascade
      Overrides:
      cascadeRegisterNewIfRequired in class DirectCollectionMapping
      Parameters:
      object - TODO
      uow - TODO
      visitedObjects - TODO
    • compareCollectionsForChange

      public void compareCollectionsForChange(Object oldCollection, Object newCollection, ChangeRecord changeRecord, AbstractSession session)
      INTERNAL: This method is used to calculate the differences between two collections.
      Overrides:
      compareCollectionsForChange in class DirectCollectionMapping
    • compareForChange

      public ChangeRecord compareForChange(Object clone, Object backUp, ObjectChangeSet owner, AbstractSession session)
      INTERNAL: This method compares the changes between two direct collections. Comparisons are made on equality not identity.
      Overrides:
      compareForChange in class DirectCollectionMapping
      Parameters:
      clone - TODO
      backUp - TODO
      owner - TODO
      session - TODO
      Returns:
      prototype.changeset.ChangeRecord TODO
    • compareObjects

      public boolean compareObjects(Object firstObject, Object secondObject, AbstractSession session)
      INTERNAL: Compare the attributes belonging to this mapping for the objects.
      Overrides:
      compareObjects in class DirectCollectionMapping
      Parameters:
      firstObject - TODO
      secondObject - TODO
      session - TODO
      Returns:
      TODO
    • convertClassNamesToClasses

      public void convertClassNamesToClasses(ClassLoader classLoader)
      Description copied from class: DirectCollectionMapping
      INTERNAL: Convert all the class-name-based settings in this mapping to actual class-based settings This method is implemented by subclasses as necessary.
      Overrides:
      convertClassNamesToClasses in class DirectCollectionMapping
      Parameters:
      classLoader - TODO
    • createMapComponentFromRow

      public Object createMapComponentFromRow(AbstractRecord dbRow, ObjectBuildingQuery query, CacheKey parentCacheKey, AbstractSession session, boolean isTargetProtected)
      INTERNAL Called when a DatabaseMapping is used to map the key in a collection. Returns the key.
      Specified by:
      createMapComponentFromRow in interface MapComponentMapping
    • getDirectKeyField

      public DatabaseField getDirectKeyField()
      INTERNAL:
    • initialize

      public void initialize(AbstractSession session) throws DescriptorException
      INTERNAL: Initialize and validate the mapping properties.
      Overrides:
      initialize in class DirectCollectionMapping
      Throws:
      DescriptorException
    • initializeDeleteQuery

      protected void initializeDeleteQuery(AbstractSession session)
      Overrides:
      initializeDeleteQuery in class DirectCollectionMapping
    • initializeInsertQuery

      protected void initializeInsertQuery(AbstractSession session)
      Initialize insert query. This query is used to insert the collection of objects into the reference table.
      Overrides:
      initializeInsertQuery in class DirectCollectionMapping
    • initializeSelectionStatement

      protected void initializeSelectionStatement(AbstractSession session)
      Overrides:
      initializeSelectionStatement in class DirectCollectionMapping
    • iterateOnRealAttributeValue

      public void iterateOnRealAttributeValue(DescriptorIterator iterator, Object realAttributeValue)
      INTERNAL: Iterate on the attribute value. The value holder has already been processed. PERF: Avoid iteration if not required.
      Overrides:
      iterateOnRealAttributeValue in class DirectCollectionMapping
    • iterateOnElement

      public void iterateOnElement(DescriptorIterator iterator, Object element)
      INTERNAL: Iterate on the specified element.
      Overrides:
      iterateOnElement in class DirectCollectionMapping
    • isDirectMapMapping

      public boolean isDirectMapMapping()
      INTERNAL: Related mapping should implement this method to return true.
      Overrides:
      isDirectMapMapping in class DatabaseMapping
    • mergeChangesIntoObject

      public void mergeChangesIntoObject(Object target, ChangeRecord changeRecord, Object source, MergeManager mergeManager, AbstractSession targetSession)
      INTERNAL: Merge changes from the source to the target object. Because this is a collection mapping, values are added to or removed from the collection based on the changeset.
      Overrides:
      mergeChangesIntoObject in class DirectCollectionMapping
    • mergeIntoObject

      public void mergeIntoObject(Object target, boolean isTargetUnInitialized, Object source, MergeManager mergeManager, AbstractSession targetSession)
      INTERNAL: Merge changes from the source to the target object.
      Overrides:
      mergeIntoObject in class DirectCollectionMapping
    • performDataModificationEvent

      public void performDataModificationEvent(Object[] event, AbstractSession session) throws DatabaseException, DescriptorException
      INTERNAL: Perform the commit event. This is used in the uow to delay data modifications. This is mostly dealt with in the superclass. Private Owned deletes require extra functionality
      Overrides:
      performDataModificationEvent in class DirectCollectionMapping
      Throws:
      DatabaseException
      DescriptorException
    • postCalculateChanges

      public void postCalculateChanges(ChangeRecord changeRecord, UnitOfWorkImpl uow)
      INTERNAL: Overridden by mappings that require additional processing of the change record after the record has been calculated.
      Overrides:
      postCalculateChanges in class DirectCollectionMapping
    • postInsert

      public void postInsert(WriteObjectQuery query) throws DatabaseException
      INTERNAL: Insert the private owned object.
      Overrides:
      postInsert in class DirectCollectionMapping
      Throws:
      DatabaseException
    • postUpdateWithChangeSet

      protected void postUpdateWithChangeSet(WriteObjectQuery writeQuery) throws DatabaseException
      INTERNAL: Update private owned part.
      Overrides:
      postUpdateWithChangeSet in class DirectCollectionMapping
      Throws:
      DatabaseException
    • preDelete

      public void preDelete(DeleteObjectQuery query) throws DatabaseException
      INTERNAL: Propagate the preDelete event through the container policy if necessary
      Overrides:
      preDelete in class DirectCollectionMapping
      Throws:
      DatabaseException
    • initOrRebuildSelectQuery

      protected void initOrRebuildSelectQuery()
      INTERNAL: Rebuild select query.
      Overrides:
      initOrRebuildSelectQuery in class DirectCollectionMapping
    • recordPrivateOwnedRemovals

      public void recordPrivateOwnedRemovals(Object object, UnitOfWorkImpl uow)
      INTERNAL: Overridden by mappings that require additional processing of the change record after the record has been calculated.
      Overrides:
      recordPrivateOwnedRemovals in class DirectCollectionMapping
    • removeFromCollectionChangeRecord

      protected void removeFromCollectionChangeRecord(Object newKey, Object newValue, ObjectChangeSet objectChangeSet, UnitOfWorkImpl uow) throws DescriptorException
      INTERNAL: Remove a value and its change set from the collection change record. This is used by attribute change tracking.
      Throws:
      DescriptorException
    • setDirectKeyField

      public void setDirectKeyField(DatabaseField keyField)
      INTERNAL:
    • setDirectKeyFieldClassification

      public void setDirectKeyFieldClassification(Class<?> fieldType)
      ADVANCED: Set the class type of the field value. This can be used if field value differs from the object value, has specific typing requirements such as usage of java.sql.Blob or NChar. This must be called after the field name has been set.
    • setDirectKeyFieldClassificationName

      public void setDirectKeyFieldClassificationName(String fieldTypeName)
      ADVANCED: Set the class type name of the field value. This can be used if field value differs from the object value, has specific typing requirements such as usage of java.sql.Blob or NChar. This must be called after the direct key field has been set.
    • setDirectKeyFieldName

      public void setDirectKeyFieldName(String fieldName)
      PUBLIC: Set the direct key field name in the reference table. This is the field that the primitive data value of the Map key is stored in.
    • updateChangeRecord

      public void updateChangeRecord(Object clone, Object newValue, Object oldValue, ObjectChangeSet objectChangeSet, UnitOfWorkImpl uow) throws DescriptorException
      INTERNAL: Either create a new change record or update the change record with the new value. This is used by attribute change tracking.
      Overrides:
      updateChangeRecord in class DirectCollectionMapping
      Throws:
      DescriptorException
    • updateCollectionChangeRecord

      public void updateCollectionChangeRecord(CollectionChangeEvent event, ObjectChangeSet changeSet, UnitOfWorkImpl uow)
      INTERNAL: Add or removes a new value and its change set to the collection change record based on the event passed in. This is used by attribute change tracking.
      Overrides:
      updateCollectionChangeRecord in class DirectCollectionMapping
    • useMapClass

      public void useMapClass(Class<?> concreteClass)
      PUBLIC: Configure the mapping to use an instance of the specified container class to hold the target objects.

      The default container class is java.util.Hashtable.

      The container class must implements (directly or indirectly) the Map interface.

      Note: Do not use both useMapClass(Class concreteClass), useTransparentMap(). The last use of one of the two methods will override the previous one.

      Overrides:
      useMapClass in class CollectionMapping
    • useTransparentMap

      public void useTransparentMap()
      PUBLIC: Configure the mapping to use an instance of the specified container class to hold the target objects.

      The container class must implement (directly or indirectly) the Map interface.

      Note: Do not use both useMapClass(Class concreteClass), useTransparentMap(). The last use of one of the two methods will override the previous one.

    • setKeyClass

      public void setKeyClass(Class<?> keyClass)
      PUBLIC: This is a helper method to set the key converter to a TypeConversionConverter. This ensures that the key value from the database is converted to the correct Java type. The converter can also be set directly. Note that setting the converter to another converter will overwrite this setting.
    • getKeyClass

      public Class<?> getKeyClass()
      PUBLIC: This is a helper method to get the object class from the key converter if it is a TypeConversionConverter. This returns null if not using a TypeConversionConverter key converter.
    • setValueClass

      public void setValueClass(Class<?> valueClass)
      PUBLIC: This is a helper method to set the value converter to a TypeConversionConverter. This ensures that the value from the database is converted to the correct Java type. The converter can also be set directly. Note that setting the converter to another converter will overwrite this setting.
    • simpleAddToCollectionChangeRecord

      public void simpleAddToCollectionChangeRecord(Object referenceKey, Object objectToAdd, ObjectChangeSet changeSet, AbstractSession session)
      ADVANCED: This method is used to have an object add to a collection once the changeSet is applied The referenceKey parameter should only be used for direct Maps.
      Overrides:
      simpleAddToCollectionChangeRecord in class DirectCollectionMapping
    • simpleRemoveFromCollectionChangeRecord

      public void simpleRemoveFromCollectionChangeRecord(Object referenceKey, Object objectToRemove, ObjectChangeSet changeSet, AbstractSession session)
      ADVANCED: This method is used to have an object removed from a collection once the changeSet is applied The referenceKey parameter should only be used for direct Maps.
      Overrides:
      simpleRemoveFromCollectionChangeRecord in class DirectCollectionMapping
    • getValueClass

      public Class<?> getValueClass()
      PUBLIC: This is a helper method to get the object class from the value converter if it is a TypeConversionConverter. This returns null if not using a TypeConversionConverter value converter.
    • executeBatchQuery

      protected void executeBatchQuery(DatabaseQuery query, CacheKey parentCacheKey, Map referenceDataByKey, AbstractSession session, AbstractRecord translationRow)
      INTERNAL: Prepare and execute the batch query and store the results for each source object in a map keyed by the mappings source keys of the source objects.
      Overrides:
      executeBatchQuery in class DirectCollectionMapping
    • valueFromRowInternalWithJoin

      protected Object valueFromRowInternalWithJoin(AbstractRecord row, JoinedAttributeManager joinManager, ObjectBuildingQuery sourceQuery, CacheKey parentCacheKey, AbstractSession executionSession, boolean isTargetProtected) throws DatabaseException
      INTERNAL: Return the value of the field from the row or a value holder on the query to obtain the object.
      Overrides:
      valueFromRowInternalWithJoin in class DirectCollectionMapping
      Throws:
      DatabaseException