Class CacheBasedValueHolder<T>

java.lang.Object
org.eclipse.persistence.internal.indirection.DatabaseValueHolder<T>
org.eclipse.persistence.internal.indirection.CacheBasedValueHolder<T>
All Implemented Interfaces:
Serializable, Cloneable, ValueHolderInterface<T>, WeavedAttributeValueHolderInterface<T>

public class CacheBasedValueHolder<T> extends DatabaseValueHolder<T>

Purpose: In certain cases the contents of a relationship may be retrievable from a cache. This ValueHolder instance provides the mechanism to store a cached relationship and to load that relationship from a cache. This functionality requires that the persistent identities of the targets can be collected as database type foreign key queries are unavailable.

Since:
EclipseLink 1.1
See Also:
  • Field Details

    • mapping

      protected transient ForeignReferenceMapping mapping
    • references

      protected Object[] references
    • shouldAllowInstantiationDeferral

      protected boolean shouldAllowInstantiationDeferral
      Setting to force the instantiation of the Collection on modification
  • Constructor Details

  • Method Details

    • getCachedPKs

      public Object[] getCachedPKs()
    • getValue

      public T getValue(UnitOfWorkImpl uow)
      Process against the UOW and attempt to load a local copy before going to the shared cache If null is returned then the calling UOW will instantiate as normal.
      Overrides:
      getValue in class DatabaseValueHolder<T>
    • instantiate

      protected T instantiate() throws DatabaseException
      Description copied from class: DatabaseValueHolder
      Instantiate the object.
      Specified by:
      instantiate in class DatabaseValueHolder<T>
      Throws:
      DatabaseException
    • instantiate

      protected T instantiate(AbstractSession localSession) throws DatabaseException
      Throws:
      DatabaseException
    • instantiateForUnitOfWorkValueHolder

      public T instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder<T> unitOfWorkValueHolder)
      Triggers UnitOfWork valueholders directly without triggering the wrapped valueholder (this).

      When in transaction and/or for pessimistic locking the UnitOfWorkValueHolder needs to be triggered directly without triggering the wrapped valueholder. However only the wrapped valueholder knows how to trigger the indirection, i.e. it may be a batchValueHolder, and it stores all the info like the row and the query. Note: This method is not thread-safe. It must be used in a synchronized manner

      Specified by:
      instantiateForUnitOfWorkValueHolder in class DatabaseValueHolder<T>
    • isPessimisticLockingValueHolder

      public boolean isPessimisticLockingValueHolder()
      Description copied from class: DatabaseValueHolder
      Answers if this valueholder is a pessimistic locking one. Such valueholders are special in that they can be triggered multiple times by different UnitsOfWork. Each time a lock query will be issued. Hence even if instantiated it may have to be instantiated again, and once instantiated all fields can not be reset. Note: Implementations of this method are not necessarily thread-safe. They must be used in a synchronizaed manner
      Specified by:
      isPessimisticLockingValueHolder in class DatabaseValueHolder<T>
    • setShouldAllowInstantiationDeferral

      public void setShouldAllowInstantiationDeferral(boolean shouldAllowInstantiationDeferral)
      Set if instantiation deferral on modification should be available.
    • shouldAllowInstantiationDeferral

      public boolean shouldAllowInstantiationDeferral()
      INTERNAL: Return if add/remove should trigger instantiation or avoid. Current instantiation is avoided is using change tracking.
      Specified by:
      shouldAllowInstantiationDeferral in interface WeavedAttributeValueHolderInterface<T>
      Overrides:
      shouldAllowInstantiationDeferral in class DatabaseValueHolder<T>