Class FieldsLockingPolicy

    • Nested Class Summary

      • Nested classes/interfaces inherited from interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy

        org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy.LockOnChange
    • Constructor Summary

      Constructors 
      Constructor Description
      FieldsLockingPolicy()
      PUBLIC: Create a new field locking policy.
    • Method Summary

      All Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and Type Method Description
      void addLockFieldsToUpdateRow​(org.eclipse.persistence.internal.sessions.AbstractRecord Record, org.eclipse.persistence.internal.sessions.AbstractSession session)
      INTERNAL: Add update fields for template row.
      abstract void addLockValuesToTranslationRow​(ObjectLevelModifyQuery query)
      INTERNAL: Values to be included in the locking mechanism are added to the translation row.
      Expression buildDeleteExpression​(org.eclipse.persistence.internal.helper.DatabaseTable table, Expression mainExpression, org.eclipse.persistence.internal.sessions.AbstractRecord row)
      INTERNAL: When given an expression, this method will return a new expression with the optimistic locking values included.
      Expression buildUpdateExpression​(org.eclipse.persistence.internal.helper.DatabaseTable table, Expression mainExpression, org.eclipse.persistence.internal.sessions.AbstractRecord transRow, org.eclipse.persistence.internal.sessions.AbstractRecord modifyRow)
      INTERNAL: This method must be included in any locking policy.
      Object clone()
      INTERNAL: Clone the policy
      int compareWriteLockValues​(Object value1, Object value2)
      INTERNAL: This method shouldn't be called if supportsWriteLockValuesComparison() returns false.
      Object getBaseValue()
      INTERNAL: This is the base value that is older than all other values, it is used in the place of null in some situations.
      org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy.LockOnChange getLockOnChangeMode()
      ADVANCED: returns the LockOnChange mode for this policy.
      Object getValueToPutInCache​(org.eclipse.persistence.internal.sessions.AbstractRecord row, org.eclipse.persistence.internal.sessions.AbstractSession session)
      INTERNAL: Return the value that should be stored in the identity map.
      int getVersionDifference​(Object currentValue, Object domainObject, Object primaryKeys, org.eclipse.persistence.internal.sessions.AbstractSession session)
      INTERNAL: Return the number of version difference between the two states of the object.
      org.eclipse.persistence.internal.helper.DatabaseField getWriteLockField()
      INTERNAL: Return the write lock field.
      Expression getWriteLockUpdateExpression​(ExpressionBuilder builder, org.eclipse.persistence.internal.sessions.AbstractSession session)
      INTERNAL:
      Object getWriteLockValue​(Object domainObject, Object primaryKey, org.eclipse.persistence.internal.sessions.AbstractSession session)
      INTERNAL: This method will return the optimistic lock value for the object
      void initialize​(org.eclipse.persistence.internal.sessions.AbstractSession session)
      INTERNAL: It is responsible for initializing the policy;
      void initializeProperties()
      INTERNAL: It is responsible for initializing the policy;
      boolean isCascaded()
      PUBLIC: Return true if the policy uses cascade locking.
      boolean isNewerVersion​(Object currentValue, Object domainObject, Object primaryKey, org.eclipse.persistence.internal.sessions.AbstractSession session)
      INTERNAL: Compares the value and the value from the object (or cache).
      boolean isNewerVersion​(org.eclipse.persistence.internal.sessions.AbstractRecord Record, Object domainObject, Object primaryKey, org.eclipse.persistence.internal.sessions.AbstractSession session)
      INTERNAL: Compares the value from the row and from the object (or cache).
      boolean isStoredInCache()
      PUBLIC: Return true if the lock value is stored in the cache.
      void mergeIntoParentCache​(org.eclipse.persistence.internal.identitymaps.CacheKey unitOfWorkCacheKey, org.eclipse.persistence.internal.identitymaps.CacheKey parentSessionCacheKey)
      INTERNAL: This method should merge changes from the parent into the child.
      void mergeIntoParentCache​(org.eclipse.persistence.internal.sessions.UnitOfWorkImpl uow, Object primaryKey, Object object)
      INTERNAL: Only applicable when the value is stored in the cache.
      void setDescriptor​(ClassDescriptor descriptor)
      INTERNAL: Set method for the descriptor
      void setLockOnChangeMode​(org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy.LockOnChange lockOnChangeMode)
      ADVANCED: Sets the LockOnChange mode for this policy.
      void setupWriteFieldsForInsert​(ObjectLevelModifyQuery query)
      INTERNAL: Put the initial writelock value into the modifyRow.
      boolean shouldUpdateVersionOnMappingChange()
      INTERNAL: Returns true if the policy has been set to set an optimistic read lock when any mapping changes.
      boolean shouldUpdateVersionOnOwnedMappingChange()
      INTERNAL: Returns true if the policy has been set to set an optimistic read lock when a owning mapping changes.
      boolean supportsWriteLockValuesComparison()
      INTERNAL: Indicates whether compareWriteLockValues method is supported by the policy.
      void updateRowAndObjectForUpdate​(ObjectLevelModifyQuery query, Object domainObject)
      INTERNAL: Nothing to do because all updates are handled by the application
      void validateDelete​(int rowCount, Object object, DeleteObjectQuery query)
      INTERNAL: Check the row count for lock failure.
      void validateUpdate​(int rowCount, Object object, WriteObjectQuery query)
      INTERNAL: Check the row count for lock failure.
    • Constructor Detail

      • FieldsLockingPolicy

        public FieldsLockingPolicy()
        PUBLIC: Create a new field locking policy. A field locking policy is based on locking on a subset of fields by comparing with their previous values to detect field-level collisions. Note: the unit of work must be used for all updates when using field locking.
    • Method Detail

      • addLockFieldsToUpdateRow

        public void addLockFieldsToUpdateRow​(org.eclipse.persistence.internal.sessions.AbstractRecord Record,
                                             org.eclipse.persistence.internal.sessions.AbstractSession session)
        INTERNAL: Add update fields for template row. These are any unmapped fields required to write in an update. Since all fields are mapped, there is nothing required.
        Specified by:
        addLockFieldsToUpdateRow in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • addLockValuesToTranslationRow

        public abstract void addLockValuesToTranslationRow​(ObjectLevelModifyQuery query)
        INTERNAL: Values to be included in the locking mechanism are added to the translation row. Set the translation row to all the original field values.
        Specified by:
        addLockValuesToTranslationRow in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • buildDeleteExpression

        public Expression buildDeleteExpression​(org.eclipse.persistence.internal.helper.DatabaseTable table,
                                                Expression mainExpression,
                                                org.eclipse.persistence.internal.sessions.AbstractRecord row)
        INTERNAL: When given an expression, this method will return a new expression with the optimistic locking values included. The values are taken from the passed in database row. This expression will be used in a delete call.
        Specified by:
        buildDeleteExpression in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • buildUpdateExpression

        public Expression buildUpdateExpression​(org.eclipse.persistence.internal.helper.DatabaseTable table,
                                                Expression mainExpression,
                                                org.eclipse.persistence.internal.sessions.AbstractRecord transRow,
                                                org.eclipse.persistence.internal.sessions.AbstractRecord modifyRow)
        INTERNAL: This method must be included in any locking policy. When given an expression, this method will return a new expression with the optimistic locking values included. The values are taken from the passed in database row. This expression will be used in a delete call.
        Specified by:
        buildUpdateExpression in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • clone

        public Object clone()
        INTERNAL: Clone the policy
        Specified by:
        clone in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • supportsWriteLockValuesComparison

        public boolean supportsWriteLockValuesComparison()
        INTERNAL: Indicates whether compareWriteLockValues method is supported by the policy. Numeric or timestamp lock values could be compared: for every pair of values v1 and v2 - either v1<v2; or v1==v2; or v1>v2. However it's impossible to compare values for FieldsLockingPolicy for two reasons: 1. there is no "linear order": v1<v2 and v>v2 is not defined: either v1==v2 or v1!=v2; 2. locking value is not a single field which is not part of mapped object value but rather a set of object's mapped fields. That means any object's mapped attribute change is potentially a change of the locking value. For ChangedFieldsLockingPolicy every mapped attribute's change is a change of locking value. The pattern used by versioning: "if the original locking value is unchanged then the object hasn't been changed outside of the application", which allows to distinguish between the change made inside and outside the application, doesn't work for fields locking. It degenerates into useless pattern: "if the original locking value is unchanged then the object hasn't been changed". Use compareWriteLockValues method only if this method returns true.
        Specified by:
        supportsWriteLockValuesComparison in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • compareWriteLockValues

        public int compareWriteLockValues​(Object value1,
                                          Object value2)
        INTERNAL: This method shouldn't be called if supportsWriteLockValuesComparison() returns false. This method compares two writeLockValues. The writeLockValues should be non-null and of the correct type. Returns: -1 if value1 is less (older) than value2; 0 if value1 equals value2; 1 if value1 is greater (newer) than value2. Throws: NullPointerException if the passed value is null; ClassCastException if the passed value is of a wrong type.
        Specified by:
        compareWriteLockValues in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • getBaseValue

        public Object getBaseValue()
        INTERNAL: This is the base value that is older than all other values, it is used in the place of null in some situations.
        Specified by:
        getBaseValue in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • getWriteLockField

        public org.eclipse.persistence.internal.helper.DatabaseField getWriteLockField()
        INTERNAL: Return the write lock field.
        Specified by:
        getWriteLockField in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • getWriteLockUpdateExpression

        public Expression getWriteLockUpdateExpression​(ExpressionBuilder builder,
                                                       org.eclipse.persistence.internal.sessions.AbstractSession session)
        INTERNAL:
        Specified by:
        getWriteLockUpdateExpression in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • getLockOnChangeMode

        public org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy.LockOnChange getLockOnChangeMode()
        ADVANCED: returns the LockOnChange mode for this policy. This mode specifies if a Optimistic Write lock should be enforced on this entity when a set of mappings are changed. Unfortunately this locking policy can not enforce an optimistic write lock unless a FK or DTF field has changed so this type returns LockOnChange.NONE
        Specified by:
        getLockOnChangeMode in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • getValueToPutInCache

        public Object getValueToPutInCache​(org.eclipse.persistence.internal.sessions.AbstractRecord row,
                                           org.eclipse.persistence.internal.sessions.AbstractSession session)
        INTERNAL: Return the value that should be stored in the identity map. If the value is stored in the object, then return a null.
        Specified by:
        getValueToPutInCache in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • getVersionDifference

        public int getVersionDifference​(Object currentValue,
                                        Object domainObject,
                                        Object primaryKeys,
                                        org.eclipse.persistence.internal.sessions.AbstractSession session)
        INTERNAL: Return the number of version difference between the two states of the object.
        Specified by:
        getVersionDifference in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • getWriteLockValue

        public Object getWriteLockValue​(Object domainObject,
                                        Object primaryKey,
                                        org.eclipse.persistence.internal.sessions.AbstractSession session)
        INTERNAL: This method will return the optimistic lock value for the object
        Specified by:
        getWriteLockValue in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • initialize

        public void initialize​(org.eclipse.persistence.internal.sessions.AbstractSession session)
        INTERNAL: It is responsible for initializing the policy;
        Specified by:
        initialize in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • initializeProperties

        public void initializeProperties()
        INTERNAL: It is responsible for initializing the policy;
        Specified by:
        initializeProperties in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • isStoredInCache

        public boolean isStoredInCache()
        PUBLIC: Return true if the lock value is stored in the cache.
        Specified by:
        isStoredInCache in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • isCascaded

        public boolean isCascaded()
        PUBLIC: Return true if the policy uses cascade locking. Currently, not supported on this policy at this time.
        Specified by:
        isCascaded in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • isNewerVersion

        public boolean isNewerVersion​(Object currentValue,
                                      Object domainObject,
                                      Object primaryKey,
                                      org.eclipse.persistence.internal.sessions.AbstractSession session)
        INTERNAL: Compares the value and the value from the object (or cache). Will return true if the object is newer than the row.
        Specified by:
        isNewerVersion in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • isNewerVersion

        public boolean isNewerVersion​(org.eclipse.persistence.internal.sessions.AbstractRecord Record,
                                      Object domainObject,
                                      Object primaryKey,
                                      org.eclipse.persistence.internal.sessions.AbstractSession session)
        INTERNAL: Compares the value from the row and from the object (or cache). Will return true if the object is newer than the row.
        Specified by:
        isNewerVersion in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • mergeIntoParentCache

        public void mergeIntoParentCache​(org.eclipse.persistence.internal.sessions.UnitOfWorkImpl uow,
                                         Object primaryKey,
                                         Object object)
        INTERNAL: Only applicable when the value is stored in the cache.
        Specified by:
        mergeIntoParentCache in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • mergeIntoParentCache

        public void mergeIntoParentCache​(org.eclipse.persistence.internal.identitymaps.CacheKey unitOfWorkCacheKey,
                                         org.eclipse.persistence.internal.identitymaps.CacheKey parentSessionCacheKey)
        INTERNAL: This method should merge changes from the parent into the child. #see this method in VersionLockingPolicy
        Specified by:
        mergeIntoParentCache in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • setDescriptor

        public void setDescriptor​(ClassDescriptor descriptor)
        INTERNAL: Set method for the descriptor
        Specified by:
        setDescriptor in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • setLockOnChangeMode

        public void setLockOnChangeMode​(org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy.LockOnChange lockOnChangeMode)
        ADVANCED: Sets the LockOnChange mode for this policy. This mode specifies if a Optimistic Write lock should be enforced on this entity when set of mappings are changed. Unfortunately this locking policy can not always force an optimistic lock unless the core fields have changed
        Specified by:
        setLockOnChangeMode in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • setupWriteFieldsForInsert

        public void setupWriteFieldsForInsert​(ObjectLevelModifyQuery query)
        INTERNAL: Put the initial writelock value into the modifyRow. There is nothing to do because all the lock values are in the mappings.
        Specified by:
        setupWriteFieldsForInsert in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • updateRowAndObjectForUpdate

        public void updateRowAndObjectForUpdate​(ObjectLevelModifyQuery query,
                                                Object domainObject)
        INTERNAL: Nothing to do because all updates are handled by the application
        Specified by:
        updateRowAndObjectForUpdate in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • shouldUpdateVersionOnOwnedMappingChange

        public boolean shouldUpdateVersionOnOwnedMappingChange()
        INTERNAL: Returns true if the policy has been set to set an optimistic read lock when a owning mapping changes. Unfortunately this locking policy can not always force an optimistic lock unless the core fields have changed
        Specified by:
        shouldUpdateVersionOnOwnedMappingChange in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • shouldUpdateVersionOnMappingChange

        public boolean shouldUpdateVersionOnMappingChange()
        INTERNAL: Returns true if the policy has been set to set an optimistic read lock when any mapping changes. Unfortunately this locking policy can not always force an optimistic lock unless the core fields have changed
        Specified by:
        shouldUpdateVersionOnMappingChange in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • validateDelete

        public void validateDelete​(int rowCount,
                                   Object object,
                                   DeleteObjectQuery query)
        INTERNAL: Check the row count for lock failure.
        Specified by:
        validateDelete in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy
      • validateUpdate

        public void validateUpdate​(int rowCount,
                                   Object object,
                                   WriteObjectQuery query)
        INTERNAL: Check the row count for lock failure.
        Specified by:
        validateUpdate in interface org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy