Class CollectionMapping

All Implemented Interfaces:
Serializable, Cloneable, ContainerMapping
Direct Known Subclasses:
AggregateCollectionMapping, DirectCollectionMapping, EISOneToManyMapping, ManyToManyMapping, NestedTableMapping, OneToManyMapping

public abstract class CollectionMapping extends ForeignReferenceMapping implements ContainerMapping

Purpose: Abstract class for relationship mappings which store collection of objects

Since:
TOPLink/Java 1.0
See Also:
  • Field Details

    • deleteAllQuery

      protected transient ModifyQuery deleteAllQuery
      Used for delete all in m-m, dc and delete all optimization in 1-m.
    • hasCustomDeleteAllQuery

      protected transient boolean hasCustomDeleteAllQuery
    • containerPolicy

      protected ContainerPolicy containerPolicy
    • hasOrderBy

      protected boolean hasOrderBy
    • listOrderField

      protected DatabaseField listOrderField
      Field holds the order of elements in the list in the db, requires collection of type List, may be not null only in case isListOrderFieldSupported==true
    • isListOrderFieldSupported

      protected boolean isListOrderFieldSupported
      Indicates whether the mapping supports listOrderField, if it doesn't attempt to set listOrderField throws exception.
    • changeOrderTargetQuery

      protected transient DataModifyQuery changeOrderTargetQuery
      Query used when order of list members is changed. Used only if listOrderField!=null
    • orderCorrectionType

      protected OrderCorrectionType orderCorrectionType
      Specifies what should be done if the list of values read from listOrserField is invalid (there should be no nulls, no duplicates, no "holes").
    • mustDeleteReferenceObjectsOneByOne

      protected Boolean mustDeleteReferenceObjectsOneByOne
      Store if the mapping can batch delete reference objects.
    • isSynchronizeOnMerge

      protected static boolean isSynchronizeOnMerge
      Flag to indicate if collection needs to be synchronized instead of cloning during merge.
  • Constructor Details

    • CollectionMapping

      protected CollectionMapping()
      PUBLIC: Default constructor.
  • Method Details

    • addAscendingOrdering

      public void addAscendingOrdering(String queryKeyName)
      PUBLIC: Provide order support for queryKeyName in ascending order
    • addDescendingOrdering

      public void addDescendingOrdering(String queryKeyName)
      PUBLIC: Provide order support for queryKeyName in descending order.
    • addOrderBy

      public void addOrderBy(String queryKeyName, boolean isDescending)
      PUBLIC: Provide order support for queryKeyName in descending or ascending order. Called from the jpa metadata processing of an order by value.
    • addAggregateOrderBy

      public void addAggregateOrderBy(String aggregateName, String queryKeyName, boolean isDescending)
      PUBLIC: Provide order support for queryKeyName in ascending or descending order. Called from the jpa metadata processing of an order by value. The aggregate name may be chained through the dot notation.
    • buildBackupCloneForPartObject

      public Object buildBackupCloneForPartObject(Object attributeValue, Object clone, Object backup, UnitOfWorkImpl unitOfWork)
      INTERNAL: Used during building the backup shallow copy to copy the vector without re-registering the target objects.
      Specified by:
      buildBackupCloneForPartObject in class ForeignReferenceMapping
      Parameters:
      attributeValue - TODO
      clone - TODO
      backup - TODO
      unitOfWork - TODO
      Returns:
      TODO
    • 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.
      Specified by:
      buildCloneForPartObject in class ForeignReferenceMapping
      Parameters:
      attributeValue - TODO
      original - TODO
      cacheKey - TODO
      clone - TODO
      cloningSession - TODO
      refreshCascade - TODO
      isExisting - TODO
      isFromSharedCache - TODO
      Returns:
      TODO
    • buildContainerClone

      public Object buildContainerClone(Object attributeValue, AbstractSession cloningSession)
      INTERNAL: Performs a first level clone of the attribute. This generally means on the container will be cloned.
      Overrides:
      buildContainerClone in class DatabaseMapping
      Parameters:
      attributeValue - TODO
      cloningSession - TODO
      Returns:
      TODO
    • buildCopy

      public void buildCopy(Object copy, Object original, CopyGroup group)
      INTERNAL: Copy of the attribute of the object. This is NOT used for unit of work but for templatizing an object.
      Overrides:
      buildCopy in class DatabaseMapping
      Parameters:
      copy - TODO
      original - TODO
      group - TODO
    • copyElement

      protected Object copyElement(Object original, CopyGroup group)
      INTERNAL: Copies member's value
    • buildElementUnitOfWorkClone

      public Object buildElementUnitOfWorkClone(Object element, Object parent, Integer refreshCascade, UnitOfWorkImpl unitOfWork, boolean isExisting, boolean isFromSharedCache)
      INTERNAL: Clone the element, if necessary.
    • buildElementClone

      public Object buildElementClone(Object element, Object parent, CacheKey parentCacheKey, Integer refreshCascade, AbstractSession cloningSession, boolean isExisting, boolean isFromSharedCache)
      INTERNAL: Clone the element, if necessary.
    • buildExpression

      public Expression buildExpression(Object queryObject, QueryByExamplePolicy policy, Expression expressionBuilder, Map processedObjects, AbstractSession session)
      INTERNAL: In case Query By Example is used, this method generates an expression from a attribute value pair. Since this is an Aggregate mapping, a recursive call is made to the buildExpressionFromExample method of ObjectBuilder.
      Overrides:
      buildExpression in class DatabaseMapping
      Parameters:
      queryObject - TODO
      policy - TODO
      expressionBuilder - TODO
      processedObjects - TODO
      session - TODO
      Returns:
      TODO
    • buildReferencesPKList

      public Object[] buildReferencesPKList(Object entity, Object attribute, AbstractSession session)
      INTERNAL: This method will access the target relationship and create a list of information to rebuild the relationship. This method is used in combination with the CachedValueHolder to store references to PK's to be loaded from a cache instead of a query.
      Specified by:
      buildReferencesPKList in class ForeignReferenceMapping
    • cascadePerformRemoveIfRequired

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

      public void cascadePerformRemovePrivateOwnedObjectFromChangeSetIfRequired(Object object, UnitOfWorkImpl uow, Map visitedObjects)
      INTERNAL: Cascade perform removal of orphaned private owned objects from the UnitOfWorkChangeSet
      Overrides:
      cascadePerformRemovePrivateOwnedObjectFromChangeSetIfRequired in class DatabaseMapping
      Parameters:
      object - TODO
      uow - TODO
      visitedObjects - 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 DatabaseMapping
      Parameters:
      object - TODO
      newObjects - TODO
      unregisteredExistingObjects - TODO
      visitedObjects - TODO
      uow - TODO
      cascadeErrors - TODO
    • cascadeRegisterNewIfRequired

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

      public void collectQueryParameters(Set<DatabaseField> record)
      INTERNAL: This method is used to store the FK fields that can be cached that correspond to noncacheable mappings the FK field values will be used to re-issue the query when cloning the shared cache entity
      Specified by:
      collectQueryParameters in class ForeignReferenceMapping
      Parameters:
      record - TODO
    • calculateDeferredChanges

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

      public Object clone()
      INTERNAL: The mapping clones itself to create deep copy.
      Overrides:
      clone in class ForeignReferenceMapping
      Returns:
      new instance of itself
    • compareCollectionsForChange

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

      public ChangeRecord compareForChange(Object clone, Object backUp, ObjectChangeSet owner, AbstractSession session)
      INTERNAL: This method is used to create a change record from comparing two collections.
      Specified by:
      compareForChange in class DatabaseMapping
      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 ForeignReferenceMapping
      Parameters:
      firstObject - TODO
      secondObject - TODO
      session - TODO
      Returns:
      TODO
    • writeChanges

      public void writeChanges(ObjectChangeSet changeSet, WriteObjectQuery query) throws DatabaseException, OptimisticLockException
      INTERNAL: Write the changes defined in the change set for the mapping. Mapping added or removed events are raised to allow the mapping to write the changes as required.
      Throws:
      DatabaseException
      OptimisticLockException
    • compareObjectsAndWrite

      protected void compareObjectsAndWrite(WriteObjectQuery query) throws DatabaseException, OptimisticLockException
      INTERNAL: The memory objects are compared and only the changes are written to the database.
      Throws:
      DatabaseException
      OptimisticLockException
    • compareListsAndWrite

      protected void compareListsAndWrite(List previousList, List currentList, WriteObjectQuery query) throws DatabaseException, OptimisticLockException
      INTERNAL: Old and new lists are compared and only the changes are written to the database. Currently there's no support for listOrderField in CollectionMapping in case there's no change sets, so this method currently never called (currently only overriding method in AggregateCollectionMapping is called). This method should be implemented to support listOrderField functionality without change sets.
      Throws:
      DatabaseException
      OptimisticLockException
    • compareObjectsWithoutPrivateOwned

      protected boolean compareObjectsWithoutPrivateOwned(Object firstCollection, Object secondCollection, AbstractSession session)
      Compare two objects if their parts are not private owned
      Specified by:
      compareObjectsWithoutPrivateOwned in class ForeignReferenceMapping
    • compareObjectsWithPrivateOwned

      protected boolean compareObjectsWithPrivateOwned(Object firstCollection, Object secondCollection, AbstractSession session)
      Compare two objects if their parts are private owned
      Specified by:
      compareObjectsWithPrivateOwned in class ForeignReferenceMapping
    • compareLists

      protected boolean compareLists(List firstList, List secondList, AbstractSession session, boolean withPrivateOwned)
      Compare two lists. For equality the order of the elements should be the same. Used only if listOrderField != null
    • convertClassNamesToClasses

      public void convertClassNamesToClasses(ClassLoader classLoader)
      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 ForeignReferenceMapping
      Parameters:
      classLoader - TODO
    • extractResultFromBatchQuery

      public Object extractResultFromBatchQuery(ReadQuery batchQuery, CacheKey parentCacheKey, AbstractRecord sourceRow, AbstractSession session, ObjectLevelReadQuery originalQuery) throws QueryException
      INTERNAL: Extract the value from the batch optimized query, this should be supported by most query types.
      Overrides:
      extractResultFromBatchQuery in class ForeignReferenceMapping
      Throws:
      QueryException
    • executeBatchQuery

      protected void executeBatchQuery(DatabaseQuery query, CacheKey parentCacheKey, Map referenceObjectsByKey, 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 ForeignReferenceMapping
    • extractKeyFromTargetRow

      protected Object extractKeyFromTargetRow(AbstractRecord row, AbstractSession session)
      INTERNAL: Extract the source primary key value from the target row. Used for batch reading, most following same order and fields as in the mapping. The method should be overridden by classes that support batch reading.
    • fixRealObjectReferences

      public void fixRealObjectReferences(Object object, Map<Object,ObjectDescriptor> objectDescriptors, Map<Object,Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session)
      INTERNAL: We are not using a remote valueholder so we need to replace the reference object(s) with the corresponding object(s) from the remote session.
      Overrides:
      fixRealObjectReferences in class DatabaseMapping
      Parameters:
      object - TODO
      objectDescriptors - TODO
      processedObjects - TODO
      query - TODO
      session - TODO
    • getContainerPolicy

      public ContainerPolicy getContainerPolicy()
      INTERNAL: Returns the receiver's containerPolicy.
      Specified by:
      getContainerPolicy in interface ContainerMapping
      Overrides:
      getContainerPolicy in class DatabaseMapping
      Returns:
      TODO
    • getDeleteAllQuery

      protected ModifyQuery getDeleteAllQuery()
    • getJoinCriteria

      public Expression getJoinCriteria(ObjectExpression context, Expression base)
      INTERNAL: Returns the join criteria stored in the mapping selection query. This criteria is used to read reference objects across the tables from the database.
      Overrides:
      getJoinCriteria in class ForeignReferenceMapping
    • getObjectCorrespondingTo

      public Object getObjectCorrespondingTo(Object object, DistributedSession session, Map<Object,ObjectDescriptor> objectDescriptors, Map<Object,Object> processedObjects, ObjectLevelReadQuery query)
      INTERNAL: return the object on the client corresponding to the specified object. CollectionMappings have to worry about maintaining object identity.
      Overrides:
      getObjectCorrespondingTo in class ForeignReferenceMapping
      Parameters:
      object - TODO
      session - TODO
      objectDescriptors - TODO
      processedObjects - TODO
      query - TODO
      Returns:
      TODO
    • getOrderByQueryKeyExpressions

      public List<Expression> getOrderByQueryKeyExpressions()
      INTERNAL: Return the ordering query keys. Used for Workbench integration.
    • getSelectionQueryContainerPolicy

      protected ContainerPolicy getSelectionQueryContainerPolicy()
      INTERNAL: Get the container policy from the selection query for this mapping. This method is overridden in DirectCollectionMapping since its selection query is a DataReadQuery.
    • getRealCollectionAttributeValueFromObject

      public Object getRealCollectionAttributeValueFromObject(Object object, AbstractSession session) throws DescriptorException
      Convenience method. Return the value of an attribute, unwrapping value holders if necessary. If the value is null, build a new container.
      Overrides:
      getRealCollectionAttributeValueFromObject in class DatabaseMapping
      Throws:
      DescriptorException
    • getListOrderField

      public DatabaseField getListOrderField()
      PUBLIC: Field holds the order of elements in the list in the db, requires collection of type List; may be not null only in case isListOrderFieldSupported==true.
    • getTargetPrimaryKeyFields

      public List<DatabaseField> getTargetPrimaryKeyFields()
      INTERNAL: Returns list of primary key fields from the reference descriptor.
    • getOrderCorrectionType

      public OrderCorrectionType getOrderCorrectionType()
      PUBLIC: Specifies what should be done if the list of values read from listOrserField is invalid (there should be no nulls, no duplicates, no "holes").
    • hasCustomDeleteAllQuery

      protected boolean hasCustomDeleteAllQuery()
    • hasOrderBy

      public boolean hasOrderBy()
      INTERNAL: Return true if ascending or descending ordering has been set on this mapping via the @OrderBy annotation.
    • initialize

      public void initialize(AbstractSession session) throws DescriptorException
      INTERNAL: Initialize the state of mapping.
      Overrides:
      initialize in class ForeignReferenceMapping
      Throws:
      DescriptorException
    • initializeListOrderField

      protected void initializeListOrderField(AbstractSession session)
      INTERNAL: Initializes listOrderField. Precondition: listOrderField != null.
    • initializeListOrderFieldTable

      protected void initializeListOrderFieldTable(AbstractSession session)
      INTERNAL: Initializes listOrderField's table, does nothing by default. Precondition: listOrderField != null.
    • buildListOrderField

      protected void buildListOrderField()
      INTERNAL: Verifies listOrderField's table, if none found sets the default one. Precondition: listOrderField != null.
    • shouldUseLazyInstantiationForIndirectCollection

      public Boolean shouldUseLazyInstantiationForIndirectCollection()
      ADVANCED: This method should only be called after this mapping's indirection policy has been set IndirectList and IndirectSet can be configured not to instantiate the list from the database when you add and remove from them. IndirectList defaults to this behavior. When Set to true, the collection associated with this TransparentIndirection will be setup so as not to instantiate for adds and removes. The weakness of this setting for an IndirectSet is that when the set is not instantiated, if a duplicate element is added, it will not be detected until commit time.
    • shouldUseListOrderFieldTableExpression

      public boolean shouldUseListOrderFieldTableExpression()
      INTERNAL: Indicates whether getListOrderFieldExpression method should create field expression based on table expression.
    • initializeChangeOrderTargetQuery

      protected void initializeChangeOrderTargetQuery(AbstractSession session)
      INTERNAL: Initialize changeOrderTargetQuery.
    • isCollectionMapping

      public boolean isCollectionMapping()
      INTERNAL: Return whether this mapping is a Collection type.
      Overrides:
      isCollectionMapping in class DatabaseMapping
      Returns:
      TODO
    • isMapKeyObjectRelationship

      public boolean isMapKeyObjectRelationship()
      INTERNAL: Return if this mapping has a mapped key that uses a OneToOne (object).
    • isAttributeValueInstantiatedOrChanged

      public boolean isAttributeValueInstantiatedOrChanged(Object object)
      INTERNAL: The referenced object is checked if it is instantiated or not, also check if it has been changed (as indirect collections avoid instantiation on add/remove.
    • iterateOnElement

      public void iterateOnElement(DescriptorIterator iterator, Object element)
      INTERNAL: Iterate on the specified element.
    • iterateOnRealAttributeValue

      public void iterateOnRealAttributeValue(DescriptorIterator iterator, Object realAttributeValue)
      INTERNAL: Iterate on the attribute value. The value holder has already been processed.
      Specified by:
      iterateOnRealAttributeValue in class ForeignReferenceMapping
    • load

      public void load(Object object, AttributeItem item, AbstractSession session, boolean fromFetchGroup)
      Force instantiation of the load group.
      Overrides:
      load in class ForeignReferenceMapping
    • loadAll

      public void loadAll(Object object, AbstractSession session, IdentityHashSet loaded)
      Force instantiation of all indirections.
      Overrides:
      loadAll in class DatabaseMapping
    • mustDeleteReferenceObjectsOneByOne

      public boolean mustDeleteReferenceObjectsOneByOne()
      ADVANCED: Return whether the reference objects must be deleted one by one, as opposed to with a single DELETE statement.
    • mergeChangesIntoObject

      public void mergeChangesIntoObject(Object target, ChangeRecord chgRecord, 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
      Specified by:
      mergeChangesIntoObject in class DatabaseMapping
    • mergeIntoObject

      public void mergeIntoObject(Object target, boolean isTargetUnInitialized, Object source, MergeManager mergeManager, AbstractSession targetSession)
      INTERNAL: Merge changes from the source to the target object. This merge is only called when a changeSet for the target does not exist or the target is uninitialized
      Specified by:
      mergeIntoObject in class DatabaseMapping
    • objectAddedDuringUpdate

      protected void objectAddedDuringUpdate(ObjectLevelModifyQuery query, Object objectAdded, ObjectChangeSet changeSet, Map extraData) throws DatabaseException, OptimisticLockException
      INTERNAL: An object was added to the collection during an update, insert it if private.
      Throws:
      DatabaseException
      OptimisticLockException
    • objectOrderChangedDuringUpdate

      protected void objectOrderChangedDuringUpdate(WriteObjectQuery query, Object orderChangedObject, int orderIndex)
    • objectRemovedDuringUpdate

      protected void objectRemovedDuringUpdate(ObjectLevelModifyQuery query, Object objectDeleted, Map extraData) throws DatabaseException, OptimisticLockException
      INTERNAL: An object was removed to the collection during an update, delete it if private.
      Throws:
      DatabaseException
      OptimisticLockException
    • objectUnchangedDuringUpdate

      protected void objectUnchangedDuringUpdate(ObjectLevelModifyQuery query, Object object) throws DatabaseException, OptimisticLockException
      INTERNAL: An object is still in the collection, update it as it may have changed.
      Throws:
      DatabaseException
      OptimisticLockException
    • 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 DatabaseMapping
    • 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 DatabaseMapping
    • postPrepareNestedBatchQuery

      protected void postPrepareNestedBatchQuery(ReadQuery batchQuery, ObjectLevelReadQuery query)
      INTERNAL: Add additional fields
      Overrides:
      postPrepareNestedBatchQuery in class ForeignReferenceMapping
    • getAdditionalFieldsBaseExpression

      protected Expression getAdditionalFieldsBaseExpression(ReadQuery query)
      INTERNAL: Return the base expression to use for adding fields to the query. Normally this is the query's builder, but may be the join table for m-m.
    • prepareTranslationRow

      protected void prepareTranslationRow(AbstractRecord translationRow, Object object, ClassDescriptor descriptor, AbstractSession session)
      INTERNAL: copies the non primary key information into the row currently used only in ManyToMany
    • postDelete

      public void postDelete(DeleteObjectQuery query) throws DatabaseException
      INTERNAL: A subclass should implement this method if it wants different behavior. Recurse thru the parts to delete the reference objects after the actual object is deleted.
      Overrides:
      postDelete in class DatabaseMapping
      Throws:
      DatabaseException
    • postInitialize

      public void postInitialize(AbstractSession session)
      INTERNAL: Ensure the container policy is post initialized
      Overrides:
      postInitialize in class DatabaseMapping
    • postInsert

      public void postInsert(WriteObjectQuery query) throws DatabaseException
      INTERNAL: A subclass should implement this method if it wants different behavior. Recurse thru the parts to delete the reference objects after the actual object is deleted.
      Overrides:
      postInsert in class DatabaseMapping
      Throws:
      DatabaseException
    • preInsert

      public void preInsert(WriteObjectQuery query) throws DatabaseException, OptimisticLockException
      INTERNAL: Propagate preInsert event to container policy if necessary
      Overrides:
      preInsert in class DatabaseMapping
      Throws:
      DatabaseException
      OptimisticLockException
    • preUpdate

      public void preUpdate(WriteObjectQuery query) throws DatabaseException
      INTERNAL: Propagate preUpdate event to container policy if necessary
      Overrides:
      preUpdate in class DatabaseMapping
      Throws:
      DatabaseException
    • objectUnchangedDuringUpdate

      protected void objectUnchangedDuringUpdate(ObjectLevelModifyQuery query, Object object, Map backupclones, Object key) throws DatabaseException, OptimisticLockException
      INTERNAL: An object is still in the collection, update it as it may have changed.
      Throws:
      DatabaseException
      OptimisticLockException
    • readPrivateOwnedForObject

      protected Object readPrivateOwnedForObject(ObjectLevelModifyQuery modifyQuery) throws DatabaseException
      INTERNAL: All the privately owned parts are read
      Throws:
      DatabaseException
    • replaceValueHoldersIn

      public Map replaceValueHoldersIn(Object object, RemoteSessionController controller)
      INTERNAL: replace the value holders in the specified reference object(s)
      Overrides:
      replaceValueHoldersIn in class ForeignReferenceMapping
    • setContainerPolicy

      public void setContainerPolicy(ContainerPolicy containerPolicy)
      ADVANCED: Configure the mapping to use a container policy. The policy manages the access to the collection.
      Specified by:
      setContainerPolicy in interface ContainerMapping
    • setCustomDeleteAllQuery

      public void setCustomDeleteAllQuery(ModifyQuery query)
      PUBLIC: The default delete all query for mapping can be overridden by specifying the new query. This query is responsible for doing the deletion required by the mapping, such as deletion of all the rows from join table for M-M, or optimized delete all of target objects for 1-M.
    • setDeleteAllQuery

      protected void setDeleteAllQuery(ModifyQuery query)
    • setDeleteAllSQLString

      public void setDeleteAllSQLString(String sqlString)
      PUBLIC: Set the receiver's delete all SQL string. This allows the user to override the SQL generated by TopLink, with there own SQL or procedure call. The arguments are translated from the fields of the source row, through replacing the field names marked by '#' with the values for those fields. This SQL is responsible for doing the deletion required by the mapping, such as deletion of all the rows from join table for M-M, or optimized delete all of target objects for 1-M. Example, 'delete from PROJ_EMP where EMP_ID = #EMP_ID'.
    • setDeleteAllCall

      public void setDeleteAllCall(Call call)
      PUBLIC: Set the receiver's delete all call. This allows the user to override the SQL generated by TopLink, with there own SQL or procedure call. The arguments are translated from the fields of the source row. This call is responsible for doing the deletion required by the mapping, such as deletion of all the rows from join table for M-M, or optimized delete all of target objects for 1-M. Example, 'new SQLCall("delete from PROJ_EMP where EMP_ID = #EMP_ID")'.
    • setHasCustomDeleteAllQuery

      protected void setHasCustomDeleteAllQuery(boolean bool)
    • setSelectionQueryContainerPolicy

      protected void setSelectionQueryContainerPolicy(ContainerPolicy containerPolicy)
      INTERNAL: Set the container policy on the selection query for this mapping. This method is overridden in DirectCollectionMapping since its selection query is a DataReadQuery.
    • setSessionName

      public void setSessionName(String name)
      PUBLIC: Set the name of the session to execute the mapping's queries under. This can be used by the session broker to override the default session to be used for the target class.
    • setUseLazyInstantiationForIndirectCollection

      public void setUseLazyInstantiationForIndirectCollection(Boolean useLazyInstantiation)
      ADVANCED: Calling this method will only affect behavior of mappings using transparent indirection This method should only be called after this mapping's indirection policy has been set IndirectList and IndirectSet can be configured not to instantiate the list from the database when you add and remove from them. IndirectList defaults to this behavior. When Set to true, the collection associated with this TransparentIndirection will be setup so as not to instantiate for adds and removes. The weakness of this setting for an IndirectSet is that when the set is not instantiated, if a duplicate element is added, it will not be detected until commit time.
    • simpleAddToCollectionChangeRecord

      public void simpleAddToCollectionChangeRecord(Object referenceKey, Object changeSetToAdd, 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 DatabaseMapping
    • simpleRemoveFromCollectionChangeRecord

      public void simpleRemoveFromCollectionChangeRecord(Object referenceKey, Object changeSetToRemove, 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 DatabaseMapping
    • updateChangeRecord

      public void updateChangeRecord(Object clone, Object newValue, Object oldValue, ObjectChangeSet objectChangeSet, UnitOfWorkImpl uow)
      INTERNAL: Either create a new change record or update with the new value. This is used by attribute change tracking. Specifically in a collection mapping this will be called when the customer Set a new collection. In this case we will need to mark the change record with the new and the old versions of the collection. And mark the ObjectChangeSet with the attribute name then when the changes are calculated force a compare on the collections to determine changes.
      Overrides:
      updateChangeRecord in class DatabaseMapping
    • updateChangeRecordForSelfMerge

      public void updateChangeRecordForSelfMerge(ChangeRecord changeRecord, Object source, Object target, UnitOfWorkChangeSet parentUOWChangeSet, UnitOfWorkImpl unitOfWork)
      INTERNAL: Update a ChangeRecord to replace the ChangeSet for the old entity with the changeSet for the new Entity. This is used when an Entity is merged into itself and the Entity reference new or detached entities.
      Specified by:
      updateChangeRecordForSelfMerge in class ForeignReferenceMapping
    • 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 DatabaseMapping
    • setChangeListener

      public void setChangeListener(Object clone, PropertyChangeListener listener, UnitOfWorkImpl uow)
      INTERNAL: Set the change listener in the collection. If the collection is not indirect it must be re-built. This is used for resuming or flushing units of work.
      Overrides:
      setChangeListener in class DatabaseMapping
    • isListOrderFieldSupported

      public boolean isListOrderFieldSupported()
      PUBLIC: indicates whether the mapping supports listOrderField, if it doesn't attempt to set listOrderField throws exception.
    • setListOrderField

      public void setListOrderField(DatabaseField field)
      PUBLIC: Field holds the order of elements in the list in the db, requires collection of type List. Throws exception if the mapping doesn't support listOrderField.
    • setListOrderFieldName

      public void setListOrderFieldName(String fieldName)
      PUBLIC: Field holds the order of elements in the list in the db, requires collection of type List. Throws exception if the mapping doesn't support listOrderField.
    • setMustDeleteReferenceObjectsOneByOne

      public void setMustDeleteReferenceObjectsOneByOne(Boolean deleteOneByOne)
      ADVANCED:: Return whether the reference objects must be deleted one by one, as opposed to with a single DELETE statement. Note: Calling this method disables an optimization of the delete behavior
    • setOrderCorrectionType

      public void setOrderCorrectionType(OrderCorrectionType orderCorrectionType)
      PUBLIC: Specifies what should be done if the list of values read from listOrserField is invalid (there should be no nulls, no duplicates, no "holes").
    • useCollectionClass

      public void useCollectionClass(Class<?> concreteClass)
      PUBLIC: Configure the mapping to use an instance of the specified container class to hold the target objects. Note that if listOrderField is used then setListOrderField method should be called before this method.

      The container class must implement (directly or indirectly) the java.util.Collection interface.

      Specified by:
      useCollectionClass in interface ContainerMapping
    • useSortedSetClass

      public void useSortedSetClass(Class<?> concreteClass, Comparator comparator)
      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 java.util.SortedSet interface.

    • useSortedSetClassName

      public void useSortedSetClassName(String className)
      INTERNAL: Configure the mapping to use an instance of the specified container class name to hold the target objects. This method is used by MW.

      The container class must implement (directly or indirectly) the java.util.SortedSet interface.

    • useSortedSetClassName

      public void useSortedSetClassName(String className, String comparatorClassName)
      INTERNAL: Configure the mapping to use an instance of the specified container class name to hold the target objects. This method is used by MW.

      The container class must implement (directly or indirectly) the java.util.SortedSet interface.

    • useCollectionClassName

      public void useCollectionClassName(String concreteClassName)
      INTERNAL: Used to set the collection class by name. This is required when building from metadata to allow the correct class loader to be used.
      Specified by:
      useCollectionClassName in interface ContainerMapping
    • useListClassName

      public void useListClassName(String concreteClassName)
      INTERNAL: Used to set the collection class by name. This is required when building from metadata to allow the correct class loader to be used.
      Specified by:
      useListClassName in interface ContainerMapping
    • useMapClass

      public void useMapClass(Class<?> concreteClass, String keyName)
      PUBLIC: Configure the mapping to use an instance of the specified container class to hold the target objects. The key used to index a value in the Map is the value returned by a call to the specified zero-argument method. The method must be implemented by the class (or a superclass) of any value to be inserted into the Map.

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

      To facilitate resolving the method, the mapping's referenceClass must set before calling this method.

      Specified by:
      useMapClass in interface ContainerMapping
    • 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 key used to index a value in the Map is an instance of the composite primary key class.

      To facilitate resolving the primary key class, the mapping's referenceClass must set before calling this method.

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

    • useMapClassName

      public void useMapClassName(String concreteClassName, String methodName)
      INTERNAL: Not sure were this is used, MW?
      Specified by:
      useMapClassName in interface ContainerMapping
    • useTransparentCollection

      public void useTransparentCollection()
      PUBLIC: If transparent indirection is used, a special collection will be placed in the source object's attribute. Fetching of the contents of the collection from the database will be delayed until absolutely necessary. (Any message sent to the collection will cause the contents to be faulted in from the database.) This can result in rather significant performance gains, without having to change the source object's attribute from Collection (or List or Vector) to ValueHolderInterface.
    • useTransparentSet

      public void useTransparentSet()
      PUBLIC: If transparent indirection is used, a special collection will be placed in the source object's attribute. Fetching of the contents of the collection from the database will be delayed until absolutely necessary. (Any message sent to the collection will cause the contents to be faulted in from the database.) This can result in rather significant performance gains, without having to change the source object's attribute from Set to ValueHolderInterface.
    • useTransparentList

      public void useTransparentList()
      PUBLIC: If transparent indirection is used, a special collection will be placed in the source object's attribute. Fetching of the contents of the collection from the database will be delayed until absolutely necessary. (Any message sent to the collection will cause the contents to be faulted in from the database.) This can result in rather significant performance gains, without having to change the source object's attribute from List to ValueHolderInterface.
    • useTransparentMap

      public void useTransparentMap(String methodName)
      PUBLIC: If transparent indirection is used, a special map will be placed in the source object's attribute. Fetching of the contents of the map from the database will be delayed until absolutely necessary. (Any message sent to the map will cause the contents to be faulted in from the database.) This can result in rather significant performance gains, without having to change the source object's attribute from Map (or Map or Hashtable) to ValueHolderInterface.

      The key used in the Map is the value returned by a call to the zero parameter method named methodName. The method should be a zero argument method implemented (or inherited) by the value to be inserted into the Map.

    • validateBeforeInitialization

      public void validateBeforeInitialization(AbstractSession session) throws DescriptorException
      INTERNAL: To validate mappings declaration
      Overrides:
      validateBeforeInitialization in class ForeignReferenceMapping
      Throws:
      DescriptorException
    • verifyDelete

      public boolean verifyDelete(Object object, AbstractSession session) throws DatabaseException
      INTERNAL: Checks if object is deleted from the database or not.
      Overrides:
      verifyDelete in class DatabaseMapping
      Throws:
      DatabaseException
    • isChangeTrackingSupported

      public boolean isChangeTrackingSupported(Project project)
      INTERNAL: Return if this mapping supports change tracking.
      Overrides:
      isChangeTrackingSupported in class DatabaseMapping
    • buildChangeRecord

      public ChangeRecord buildChangeRecord(Object clone, ObjectChangeSet owner, AbstractSession session)
      INTERNAL: Directly build a change record without comparison
      Overrides:
      buildChangeRecord in class DatabaseMapping
    • valueFromPKList

      public Object valueFromPKList(Object[] pks, AbstractRecord foreignKeys, AbstractSession session)
      INTERNAL: This method is used to load a relationship from a list of PKs. This list may be available if the relationship has been cached.
      Specified by:
      valueFromPKList in class ForeignReferenceMapping
    • 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. To get here the mapping's isJoiningSupported() should return true.
      Overrides:
      valueFromRowInternalWithJoin in class ForeignReferenceMapping
      Throws:
      DatabaseException