Class QueryBasedValueHolder<T>
- java.lang.Object
-
- org.eclipse.persistence.internal.indirection.DatabaseValueHolder<T>
-
- org.eclipse.persistence.internal.indirection.QueryBasedValueHolder<T>
-
- All Implemented Interfaces:
Serializable,Cloneable,ValueHolderInterface<T>,WeavedAttributeValueHolderInterface<T>
- Direct Known Subclasses:
BatchValueHolder,EISOneToManyQueryBasedValueHolder
public class QueryBasedValueHolder<T> extends DatabaseValueHolder<T>
QueryBasedValueHolder wraps a database-stored object and implements behavior to access it. The object is read from the database by invoking a user-specified query.- Author:
- Dorin Sandu
- See Also:
ObjectLevelReadQuery, Serialized Form
-
-
Field Summary
Fields Modifier and Type Field Description protected ReadQueryqueryStores the query to be executed.protected IntegerrefreshCascadeprotected ObjectsourceObject-
Fields inherited from class org.eclipse.persistence.internal.indirection.DatabaseValueHolder
isCoordinatedWithProperty, isInstantiated, row, session, value
-
Fields inherited from interface org.eclipse.persistence.indirection.ValueHolderInterface
shouldToStringInstantiate
-
-
Constructor Summary
Constructors Modifier Constructor Description protectedQueryBasedValueHolder()QueryBasedValueHolder(ReadQuery query, Object sourceObject, AbstractRecord row, AbstractSession session)Initialize the query-based value holder.QueryBasedValueHolder(ReadQuery query, AbstractRecord row, AbstractSession session)Initialize the query-based value holder.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description ReadQuerygetQuery()Return the query.IntegergetRefreshCascadePolicy()INTERNAL: Returns the refresh cascade policy that was set on the query that was used to instantiate the valueholder a null value means that a non refresh query was used.TgetValue(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.protected Tinstantiate()Instantiate the object.protected Tinstantiate(AbstractSession session)Instantiate the object by executing the query on the session.TinstantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder<T> unitOfWorkValueHolder)Triggers UnitOfWork valueholders directly without triggering the wrapped valueholder (this).booleanisPessimisticLockingValueHolder()INTERNAL: Answers if this valueholder is a pessimistic locking one.voidpostInstantiate()INTERNAL: Run any extra code required after the valueholder instantiates For query based VH, we notify the cache that the valueholder has been triggeredvoidreleaseWrappedValueHolder(AbstractSession targetSession)Releases a wrapped valueholder privately owned by a particular unit of work.protected voidresetFields()Reset all the fields that are not needed after instantiation.protected voidsetQuery(ReadQuery theQuery)Set the query.voidsetRefreshCascadePolicy(Integer refreshCascadePolicy)INTERNAL:voidsetSourceObject(Object sourceObject)-
Methods inherited from class org.eclipse.persistence.internal.indirection.DatabaseValueHolder
clone, getRow, getSession, getValue, getWrappedValueHolder, isCoordinatedWithProperty, isEasilyInstantiated, isInstantiated, isNewlyWeavedValueHolder, isSerializedRemoteUnitOfWorkValueHolder, isTransactionalValueHolder, privilegedSetValue, setInstantiated, setIsCoordinatedWithProperty, setIsNewlyWeavedValueHolder, setRow, setSession, setUninstantiated, setValue, shouldAllowInstantiationDeferral, toString
-
-
-
-
Constructor Detail
-
QueryBasedValueHolder
protected QueryBasedValueHolder()
-
QueryBasedValueHolder
public QueryBasedValueHolder(ReadQuery query, AbstractRecord row, AbstractSession session)
Initialize the query-based value holder.
-
QueryBasedValueHolder
public QueryBasedValueHolder(ReadQuery query, Object sourceObject, AbstractRecord row, AbstractSession session)
Initialize the query-based value holder.
-
-
Method Detail
-
getRefreshCascadePolicy
public Integer getRefreshCascadePolicy()
INTERNAL: Returns the refresh cascade policy that was set on the query that was used to instantiate the valueholder a null value means that a non refresh query was used.
-
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:
getValuein classDatabaseValueHolder<T>
-
getQuery
public ReadQuery getQuery()
Return the query. The query for a QueryBasedValueHolder is constructed dynamically based on the original query on the parent object and the mapping configuration. If modifying a query the developer must be careful not to change the results returned as that may cause the application to see incorrect results.
-
instantiate
protected T instantiate() throws DatabaseException
Description copied from class:DatabaseValueHolderInstantiate the object.- Specified by:
instantiatein classDatabaseValueHolder<T>- Throws:
DatabaseException
-
instantiate
protected T instantiate(AbstractSession session) throws DatabaseException
Instantiate the object by executing the query on the session.- 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:
instantiateForUnitOfWorkValueHolderin classDatabaseValueHolder<T>
-
postInstantiate
public void postInstantiate()
INTERNAL: Run any extra code required after the valueholder instantiates For query based VH, we notify the cache that the valueholder has been triggered- Overrides:
postInstantiatein classDatabaseValueHolder<T>- See Also:
QueryBasedValueHolder
-
releaseWrappedValueHolder
public void releaseWrappedValueHolder(AbstractSession targetSession)
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.
- Overrides:
releaseWrappedValueHolderin classDatabaseValueHolder<T>
-
resetFields
protected void resetFields()
Reset all the fields that are not needed after instantiation.- Overrides:
resetFieldsin classDatabaseValueHolder<T>
-
setQuery
protected void setQuery(ReadQuery theQuery)
Set the query.
-
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 instantiated all fields can not be reset.Since locks will be issued each time this valueholder is triggered, triggering this directly on the session in auto commit mode will generate an exception. This only UnitOfWorkValueHolder's wrapping this can trigger it. Note: This method is not thread-safe. It must be used in a synchronized manner
- Specified by:
isPessimisticLockingValueHolderin classDatabaseValueHolder<T>
-
setSourceObject
public void setSourceObject(Object sourceObject)
-
setRefreshCascadePolicy
public void setRefreshCascadePolicy(Integer refreshCascadePolicy)
INTERNAL:
-
-