FileDocCategorySizeDatePackage
DatabaseValueHolder.javaAPI DocGlassfish v2 API10682Tue May 22 16:54:36 BST 2007oracle.toplink.essentials.internal.indirection

DatabaseValueHolder

public abstract class DatabaseValueHolder extends Object implements Serializable, Cloneable, WeavedAttributeValueHolderInterface
DatabaseValueHolder wraps a database-stored object and implements behavior to access it. The object is read only once from database after which is cached for faster access.
see
ValueHolderInterface
author
Dorin Sandu

Fields Summary
protected Object
value
Stores the object after it is read from the database.
protected boolean
isInstantiated
Indicates whether the object has been read from the database or not.
protected transient AbstractSession
session
Stores the session for the database that contains the object.
protected AbstractRecord
row
Stores the row representation of the object.
protected boolean
isCoordinatedWithProperty
The variable below is used as part of the implementation of WeavedAttributeValueHolderInterface It is used to track whether a valueholder that has been weaved into a class is coordinated with the underlying property Set internally in TopLink when the state of coordination between a weaved valueholder and the underlying property is known
Constructors Summary
Methods Summary
public java.lang.Objectclone()


       
        try {
            return super.clone();
        } catch (CloneNotSupportedException exception) {
            throw new InternalError();
        }
    
public oracle.toplink.essentials.internal.sessions.AbstractRecordgetRow()
Return the row.

        return row;
    
public oracle.toplink.essentials.internal.sessions.AbstractSessiongetSession()
Return the session.

        return session;
    
public synchronized java.lang.ObjectgetValue()
Return the object.

        if (!isInstantiated()) {
            // The value must be set directly because the setValue can also cause instatiation under UOW.
            privilegedSetValue(instantiate());
            setInstantiated();
            resetFields();
        }
        return value;
    
protected abstract java.lang.Objectinstantiate()
Instantiate the object.

public abstract java.lang.ObjectinstantiateForUnitOfWorkValueHolder(oracle.toplink.essentials.internal.indirection.UnitOfWorkValueHolder 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: Implementations of this method are not necessarily thread-safe. They must be used in a synchronizaed manner

public booleanisCoordinatedWithProperty()
This method is used as part of the implementation of WeavedAttributeValueHolderInterface It is used to check whether a valueholder that has been weaved into a class is coordinated with the underlying property

        return isCoordinatedWithProperty;
    
public booleanisEasilyInstantiated()
INTERNAL: Answers if this valueholder is easy to instantiate.

return
true if getValue() won't trigger a database read.

        return isInstantiated();
    
public booleanisInstantiated()
Return a boolean indicating whether the object has been read from the database or not.

        return isInstantiated;
    
public booleanisNewlyWeavedValueHolder()
This method is used as part of the implementation of WeavedAttributeValueHolderInterface. A DatabaseValueHolder is set up by TopLink and will never be a newly weaved valueholder. As a result, this method is stubbed out.

        return false;
    
public abstract booleanisPessimisticLockingValueHolder()
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: Implementations of this method are not necessarily thread-safe. They must be used in a synchronizaed manner

public booleanisSerializedRemoteUnitOfWorkValueHolder()
Used to determine if this is a remote uow value holder that was serialized to the server. It has no reference to its wrapper value holder, so must find its original object to be able to instantiate.

        return false;
    
protected booleanisTransactionalValueHolder()
Answers if this valueholder is referenced only by a UnitOfWork valueholder. I.e. it was built in valueFromRow which was called by buildCloneFromRow.

Sometimes in transaction a UnitOfWork clone, and all valueholders, are built directly from the row; however a UnitOfWorkValueHolder does not know how to instantiate itself so wraps this which does.

On a successful merge must be released to the session cache with releaseWrappedValueHolder.

        return ((session != null) && session.isUnitOfWork());
    
public voidprivilegedSetValue(java.lang.Object value)
Set the object. This is used only by the privileged methods. One must be very careful in using this method.

        this.value = value;
        isCoordinatedWithProperty = false;
    
public voidreleaseWrappedValueHolder()
Releases a wrapped valueholder privately owned by a particular unit of work.

When unit of work clones are built directly from rows no object in the shared cache points to this valueholder, so it can store the unit of work as its session. However once that UnitOfWork commits and the valueholder is merged into the shared cache, the session needs to be reset to the root session, ie. the server session.

        AbstractSession session = getSession();
        if ((session != null) && session.isUnitOfWork()) {
            setSession(session.getRootSession(null));
        }
    
protected voidresetFields()
Reset all the fields that are not needed after instantiation.

        setRow(null);
        setSession(null);
    
public voidsetInstantiated()
Set the instantiated flag to true.

        isInstantiated = true;
    
public voidsetIsCoordinatedWithProperty(boolean coordinated)
This method is used as part of the implementation of WeavedAttributeValueHolderInterface It is used internally by TopLink to set whether a valueholder that has been weaved into a class is coordinated with the underlying property

        this.isCoordinatedWithProperty = coordinated;
    
public voidsetIsNewlyWeavedValueHolder(boolean isNew)
This method is used as part of the implementation of WeavedAttributeValueHolderInterface A DatabaseValueHolder is set up by TopLink and will never be a newly weaved valueholder As a result, this method is stubbed out.

    
public voidsetRow(oracle.toplink.essentials.internal.sessions.AbstractRecord row)
Set the row.

        this.row = row;
    
public voidsetSession(oracle.toplink.essentials.internal.sessions.AbstractSession session)
Set the session.

        this.session = session;
    
public voidsetUninstantiated()
Set the instantiated flag to false.

        isInstantiated = false;
    
public voidsetValue(java.lang.Object value)
Set the object.

        this.value = value;
        setInstantiated();
    
public java.lang.StringtoString()

        if (isInstantiated()) {
            return "{" + getValue() + "}";
        } else {
            return "{" + Helper.getShortClassName(getClass()) + ": " + ToStringLocalization.buildMessage("not_instantiated", (Object[])null) + "}";
        }