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

public class RemoteValueHolder<T> extends DatabaseValueHolder<T> implements Externalizable
Remote value holders can be invoked locally and remotely. In both situations the associated indirect object is invoked.
See Also:
  • Field Details

    • id

      protected ObjID id
    • targetObjectPrimaryKeys

      protected Object targetObjectPrimaryKeys
    • mapping

      protected transient DatabaseMapping mapping
    • query

      protected transient ObjectLevelReadQuery query
    • wrappedServerValueHolder

      protected transient ValueHolderInterface<T> wrappedServerValueHolder
    • serverIndirectionObject

      protected transient Object serverIndirectionObject
  • Constructor Details

    • RemoteValueHolder

      public RemoteValueHolder()
    • RemoteValueHolder

      public RemoteValueHolder(ObjID id)
  • Method Details

    • canDoCacheCheck

      protected boolean canDoCacheCheck()
      If the reference object is mapped thru one to one mapping and the object derives its primary key value from this relationship then remote value holder has a primary key row for.
    • equals

      public boolean equals(Object object)
      Only the id is checked for equality check.
      Overrides:
      equals in class Object
    • finalize

      public void finalize()
      This method is used to remove the RemoteValueHolder from the dispatcher on Garbage collection from the client
      Overrides:
      finalize in class Object
    • getID

      public ObjID getID()
      Return the unique id.
    • getMapping

      public DatabaseMapping getMapping()
      Return the associated mapping.
    • getObjectFromCache

      protected Object getObjectFromCache()
      Get object from the cache if there is one.
    • getQuery

      public ObjectLevelReadQuery getQuery()
      Return the associated query.
    • getServerIndirectionObject

      public Object getServerIndirectionObject()
      Return the object on the server that holds on to the remote value holder. Currently used only by TransparentIndirection so we can get back to the original IndirectContainer.
    • getTargetObjectPrimaryKeys

      protected Object getTargetObjectPrimaryKeys()
      Get target object primary key row.
    • getWrappedServerValueHolder

      public ValueHolderInterface<T> getWrappedServerValueHolder()
      Return the original value holder. This is null on the client side because it is tagged transient. This is how we know whether the remote value holder is being invoked on the client or on the server.
    • hashCode

      public int hashCode()
      Return the hashcode for id, because it is unqiue.
      Overrides:
      hashCode in class Object
    • instantiate

      public T instantiate()
      Return the object.
      Specified by:
      instantiate in class DatabaseValueHolder<T>
    • isEasilyInstantiated

      public boolean isEasilyInstantiated()
      INTERNAL: Answers if this valueholder is easy to instantiate.
      Overrides:
      isEasilyInstantiated in class DatabaseValueHolder<T>
      Returns:
      true if getValue() won't trigger a database read.
    • isPessimisticLockingValueHolder

      public boolean isPessimisticLockingValueHolder()
      INTERNAL: 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 instantatiated all fields can not be reset. Note: This method is not thread-safe. It must be used in a synchronizaed manner
      Specified by:
      isPessimisticLockingValueHolder in class DatabaseValueHolder<T>
    • 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 synchronizaed manner

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

      public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
      Override the default serialization for a remote valueholder so as not to serialize the value Note: Changed for bug 3145211. We used to use the java.io.Serializable interface, but need to convert to Externalizable interface to avoid sending extra data through the superclass's serialization
      Specified by:
      readExternal in interface Externalizable
      Throws:
      IOException
      ClassNotFoundException
    • setID

      protected void setID(ObjID anID)
      Set the unique id.
    • setMapping

      public void setMapping(DatabaseMapping mapping)
      Set mapping
    • setQuery

      public void setQuery(ObjectLevelReadQuery query)
      Set the query.
    • setServerIndirectionObject

      public void setServerIndirectionObject(Object serverIndirectionObject)
      Set the object on the server that holds on to the remote value holder. Currently used only by TransparentIndirection so we can get back to the original IndirectContainer.
    • setTargetObjectPrimaryKeys

      public void setTargetObjectPrimaryKeys(Object primaryKeys)
      Set target object primary keys.
    • setValue

      public void setValue(T theValue)
      Set the object.
      Specified by:
      setValue in interface ValueHolderInterface<T>
      Overrides:
      setValue in class DatabaseValueHolder<T>
    • setWrappedServerValueHolder

      public void setWrappedServerValueHolder(ValueHolderInterface<T> wrappedServerValueHolder)
      Set the original value holder.
    • writeExternal

      public void writeExternal(ObjectOutput out) throws IOException
      Override the default serialization for a remote valueholder so as not to serialize the value Note: Changed for bug 3145211. We used to use the java.io.Serializable interface, but need to convert to Externalizable interface to avoid sending extra data through the superclass's serialization
      Specified by:
      writeExternal in interface Externalizable
      Throws:
      IOException