|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.apache.openjpa.abstractstore.AbstractStoreManager
public abstract class AbstractStoreManager
Abstract store manager implementation to ease development of custom OpenJPA back-ends. A concrete subclass must define implementations for the following methods:
StoreManager.exists(org.apache.openjpa.kernel.OpenJPAStateManager, java.lang.Object)
initialize(org.apache.openjpa.kernel.OpenJPAStateManager, org.apache.openjpa.kernel.PCState, org.apache.openjpa.kernel.FetchConfiguration, java.lang.Object)
load(org.apache.openjpa.kernel.OpenJPAStateManager, java.util.BitSet, org.apache.openjpa.kernel.FetchConfiguration, int, java.lang.Object)
flush(Collection,Collection,Collection,Collection,Collection)
executeExtent(org.apache.openjpa.meta.ClassMetaData, boolean, org.apache.openjpa.kernel.FetchConfiguration)
open()
has been called. Store manager instances might be
created to call metadata methods such as newConfiguration()
or
getUnsupportedOptions()
and never opened. These instances should
not consume any data store resources.
Notes:
StoreManager.initialize(org.apache.openjpa.kernel.OpenJPAStateManager, org.apache.openjpa.kernel.PCState, org.apache.openjpa.kernel.FetchConfiguration, java.lang.Object)
method is responsible
for creating new instances of objects freshly loaded from the
database. The method will be invoked with a OpenJPAStateManager
that the newly-loaded object should be associated with. To create the
new object and set up this association correctly, the implementation
should use the OpenJPAStateManager.initialize(java.lang.Class, org.apache.openjpa.kernel.PCState)
method.begin()
, commit()
,
and rollback()
methods.beginOptimistic()
, rollbackOptimistic()
,
and syncVersion(org.apache.openjpa.kernel.OpenJPAStateManager, java.lang.Object)
.getUnsupportedOptions()
to not include OpenJPAConfiguration.OPTION_OPTIMISTIC
in the list of unsupported
options.OpenJPAStateManager.setNextVersion(java.lang.Object)
method.Comparable
,
override compareVersion(org.apache.openjpa.kernel.OpenJPAStateManager, java.lang.Object, java.lang.Object)
, which relies on the
Comparable.compareTo(T)
method.getDataStoreIdSequence(org.apache.openjpa.meta.ClassMetaData)
method if you want to use a
long
as your datastore identity type and are
happy with OpenJPA's Id
class. To use another datastore identity
type, override getManagedType(java.lang.Object)
,
getDataStoreIdType(org.apache.openjpa.meta.ClassMetaData)
, copyDataStoreId(java.lang.Object, org.apache.openjpa.meta.ClassMetaData)
, and
newDataStoreId(java.lang.Object, org.apache.openjpa.meta.ClassMetaData)
instead. In either case, override
getUnsupportedOptions()
to not include
OpenJPAConfiguration.OPTION_ID_DATASTORE
in the list of
unsupported options.ResultList
. For more details on
MethodQL, see the OpenJPA Reference Guide.
Field Summary | |
---|---|
protected StoreContext |
ctx
|
Fields inherited from interface org.apache.openjpa.kernel.StoreManager |
---|
FORCE_LOAD_ALL, FORCE_LOAD_DFG, FORCE_LOAD_NONE, FORCE_LOAD_REFRESH, VERSION_DIFFERENT, VERSION_EARLIER, VERSION_LATER, VERSION_SAME |
Constructor Summary | |
---|---|
AbstractStoreManager()
|
Method Summary | |
---|---|
protected boolean |
assignDataStoreId(OpenJPAStateManager sm,
Object val)
Assign a new datastore identity to the given instance. |
boolean |
assignField(OpenJPAStateManager sm,
int field,
boolean preFlush)
Assign a value to the given field. |
boolean |
assignObjectId(OpenJPAStateManager sm,
boolean preFlush)
Assign an object id to the given new instance. |
void |
beforeStateChange(OpenJPAStateManager sm,
PCState fromState,
PCState toState)
Notification that the given state manager is about to change its lifecycle state. |
void |
begin()
OpenJPA assumes that after this method is invoked, all data accesses through this store manager will be part of a single unit of work that can be rolled back. |
void |
beginOptimistic()
No-op implementation. |
boolean |
cancelAll()
Returns false . |
void |
close()
Free any resources this store manager is using. |
void |
commit()
This is a no-op implementation. |
int |
compareVersion(OpenJPAStateManager state,
Object v1,
Object v2)
Casts v1 and v2 to Comparable , and
invokes v1.compareTo (v2) . |
Object |
copyDataStoreId(Object oid,
ClassMetaData meta)
Copy the given object id value. |
abstract ResultObjectProvider |
executeExtent(ClassMetaData meta,
boolean subs,
FetchConfiguration fetch)
Create a ResultObjectProvider that can return all instances
of type , optionally including subclasses as defined
by subclasses . |
Collection<Exception> |
flush(Collection<OpenJPAStateManager> sms)
Breaks down states based on the objects' current
states, and delegates to
flush(Collection,Collection,Collection,Collection,Collection) . |
protected abstract Collection<Exception> |
flush(Collection<OpenJPAStateManager> pNew,
Collection<OpenJPAStateManager> pNewUpdated,
Collection<OpenJPAStateManager> pNewFlushedDeleted,
Collection<OpenJPAStateManager> pDirty,
Collection<OpenJPAStateManager> pDeleted)
Responsible for writing modifications happened back to the data store. |
Object |
getClientConnection()
Returns null . |
StoreContext |
getContext()
Returns the StoreContext that this store manager is
associated with. |
Seq |
getDataStoreIdSequence(ClassMetaData forClass)
Returns the system-configured sequence. |
Class<?> |
getDataStoreIdType(ClassMetaData meta)
Return the class used by this StoreManager for datastore identity values. |
Class<?> |
getManagedType(Object oid)
Return the persistent class for the given data store identity value. |
protected String |
getPlatform()
Returns a string name to identify the platform of this store manager. |
protected Collection<String> |
getUnsupportedOptions()
Returns a set of option names that this store manager does not support. |
Seq |
getValueSequence(FieldMetaData forField)
Returns null. |
abstract boolean |
initialize(OpenJPAStateManager sm,
PCState state,
FetchConfiguration fetch,
Object edata)
This method is invoked when OpenJPA needs to load an object whose identity is known but which has not yet been loaded from the data store. |
abstract boolean |
load(OpenJPAStateManager sm,
BitSet fields,
FetchConfiguration fetch,
int lockLevel,
Object edata)
This method is invoked when OpenJPA needs to load additional data into an object that has already been at least partially loaded by a previous initialize(org.apache.openjpa.kernel.OpenJPAStateManager, org.apache.openjpa.kernel.PCState, org.apache.openjpa.kernel.FetchConfiguration, java.lang.Object) invocation. |
Collection<Object> |
loadAll(Collection<OpenJPAStateManager> sms,
PCState state,
int load,
FetchConfiguration fetch,
Object edata)
This implementation just delegates to the proper singular method ( StoreManager.initialize(org.apache.openjpa.kernel.OpenJPAStateManager, org.apache.openjpa.kernel.PCState, org.apache.openjpa.kernel.FetchConfiguration, java.lang.Object) or StoreManager.load(org.apache.openjpa.kernel.OpenJPAStateManager, java.util.BitSet, org.apache.openjpa.kernel.FetchConfiguration, int, java.lang.Object) )
depending on each state manager's state. |
protected OpenJPAConfiguration |
newConfiguration()
Return a new configuration instance for this runtime. |
Object |
newDataStoreId(Object val,
ClassMetaData meta)
Create a new unique datastore identity for the given type from the given oid value (presumably pk, stringified oid, or oid instance). |
FetchConfiguration |
newFetchConfiguration()
Return a fetch configuration suitable for this runtime. |
StoreQuery |
newQuery(String language)
Return a query implementation suitable for this store. |
protected void |
open()
No-op implementation. |
void |
releaseConnection()
Override to release previously-retained connection. |
void |
retainConnection()
Override to retain a dedicated connection. |
void |
rollback()
This is a no-op implementation. |
void |
rollbackOptimistic()
No-op implementation. |
void |
setContext(StoreContext ctx)
Set a reference to the corresponding context. |
boolean |
syncVersion(OpenJPAStateManager sm,
Object edata)
Since this store manager does not provide optimistic locking support, this method always returns true . |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Methods inherited from interface org.apache.openjpa.kernel.StoreManager |
---|
exists, isCached |
Field Detail |
---|
protected StoreContext ctx
Constructor Detail |
---|
public AbstractStoreManager()
Method Detail |
---|
public final void setContext(StoreContext ctx)
StoreManager
setContext
in interface StoreManager
public StoreContext getContext()
StoreContext
that this store manager is
associated with.
protected void open()
public void beginOptimistic()
beginOptimistic
in interface StoreManager
public void rollbackOptimistic()
begin()
is invoked.
rollbackOptimistic
in interface StoreManager
public void begin()
begin
in interface StoreManager
public void commit()
commit
in interface StoreManager
public void rollback()
rollback
in interface StoreManager
public boolean syncVersion(OpenJPAStateManager sm, Object edata)
true
.
syncVersion
in interface StoreManager
sm
- the instance to checkedata
- the current execution data, or null if not
given to the calling method of the context
public abstract boolean initialize(OpenJPAStateManager sm, PCState state, FetchConfiguration fetch, Object edata)
sm
is a partially-set-up state manager for this
object. The ID and least-derived type information for the instance
to load can be obtained by invoking
sm.getObjectId()
and sm.getMetaData()
.
When implementing this method, load the data for this object from
the data store, determine the most-derived subclass of the newly-loaded
data, and then use the OpenJPAStateManager.initialize(java.lang.Class, org.apache.openjpa.kernel.PCState)
method to
populate sm
with a new instance of the appropriate type.
Once OpenJPAStateManager.initialize(java.lang.Class, org.apache.openjpa.kernel.PCState)
has been invoked, proceed to
load field data into sm
as in the load(org.apache.openjpa.kernel.OpenJPAStateManager, java.util.BitSet, org.apache.openjpa.kernel.FetchConfiguration, int, java.lang.Object)
method, by
using OpenJPAStateManager.store(int, java.lang.Object)
(or the appropriate
OpenJPAStateManager.storetype
method) to put the
data into the object.
initialize
in interface StoreManager
sm
- the instance to initializestate
- the lifecycle state to initialize the state manager withfetch
- configuration for how to load the instanceedata
- the current execution data, or null if not
given to the calling method of the broker
public abstract boolean load(OpenJPAStateManager sm, BitSet fields, FetchConfiguration fetch, int lockLevel, Object edata)
initialize(org.apache.openjpa.kernel.OpenJPAStateManager, org.apache.openjpa.kernel.PCState, org.apache.openjpa.kernel.FetchConfiguration, java.lang.Object)
invocation.
Load data into sm
by using OpenJPAStateManager.store(int, java.lang.Object)
(or the appropriate
OpenJPAStateManager.storetype
method) to put the
data into the object.
load
in interface StoreManager
sm
- the instance to loadfields
- set of fields to load; all field indexes in this
set must be loaded; this set is mutablefetch
- the fetch configuration to use when loading
related objectslockLevel
- attempt to load simple fields at this lock level;
relations should be loaded at the read lock level
of the fetch configurationedata
- the current execution data, or null if not
given to the calling method of the broker
public Collection<Object> loadAll(Collection<OpenJPAStateManager> sms, PCState state, int load, FetchConfiguration fetch, Object edata)
StoreManager.initialize(org.apache.openjpa.kernel.OpenJPAStateManager, org.apache.openjpa.kernel.PCState, org.apache.openjpa.kernel.FetchConfiguration, java.lang.Object)
or StoreManager.load(org.apache.openjpa.kernel.OpenJPAStateManager, java.util.BitSet, org.apache.openjpa.kernel.FetchConfiguration, int, java.lang.Object)
)
depending on each state manager's state. If your data store provides
bulk loading APIs, overriding this method to be more clever may be
advantageous.
loadAll
in interface StoreManager
sms
- the state manager instances to loadstate
- the lifecycle state to initialize uninitialized
state managers with; may be null if no uninitialized
instances are included in sms
load
- one of the FORCE_LOAD_* constants describing the
fields to force-load if this is a refresh or retrieve actionfetch
- the current fetch configuration to use when loading
related objectsedata
- the current execution data, or null if not
given to the calling method of the broker
ImplHelper.loadAll(java.util.Collection, org.apache.openjpa.kernel.StoreManager, org.apache.openjpa.kernel.PCState, int, org.apache.openjpa.kernel.FetchConfiguration, java.lang.Object)
public Collection<Exception> flush(Collection<OpenJPAStateManager> sms)
states
based on the objects' current
states, and delegates to
flush(Collection,Collection,Collection,Collection,Collection)
.
flush
in interface StoreManager
org.apache.openjpa.util.ApplicationIds#assign()
public void beforeStateChange(OpenJPAStateManager sm, PCState fromState, PCState toState)
StoreManager
beforeStateChange
in interface StoreManager
public boolean assignObjectId(OpenJPAStateManager sm, boolean preFlush)
StoreManager
assignObjectId
in interface StoreManager
preFlush
- whether this assignment is being requested by the
system as part of pre-flush activities, and can
be ignored if it is more efficient to assign within StoreManager.flush(java.util.Collection)
ImplHelper.generateFieldValue(org.apache.openjpa.kernel.StoreContext, org.apache.openjpa.meta.FieldMetaData)
,
ImplHelper.generateIdentityValue(org.apache.openjpa.kernel.StoreContext, org.apache.openjpa.meta.ClassMetaData, int)
,
org.apache.openjpa.util.ApplicationIds#assign()
protected boolean assignDataStoreId(OpenJPAStateManager sm, Object val)
public boolean assignField(OpenJPAStateManager sm, int field, boolean preFlush)
StoreManager
assignField
in interface StoreManager
preFlush
- whether this assignment is being requested by the
system as part of pre-flush activities, and can
be ignored if it is more efficient to assign within StoreManager.flush(java.util.Collection)
ImplHelper.generateFieldValue(org.apache.openjpa.kernel.StoreContext, org.apache.openjpa.meta.FieldMetaData)
public Class<?> getManagedType(Object oid)
StoreManager
getManagedType
in interface StoreManager
public Class<?> getDataStoreIdType(ClassMetaData meta)
StoreManager
getDataStoreIdType
in interface StoreManager
public Object copyDataStoreId(Object oid, ClassMetaData meta)
StoreManager
copyDataStoreId
in interface StoreManager
public Object newDataStoreId(Object val, ClassMetaData meta)
StoreManager
newDataStoreId
in interface StoreManager
public void retainConnection()
retainConnection
in interface StoreManager
public void releaseConnection()
releaseConnection
in interface StoreManager
public Object getClientConnection()
null
. If your data store can provide a
distinct connection object, return it here.
getClientConnection
in interface StoreManager
public abstract ResultObjectProvider executeExtent(ClassMetaData meta, boolean subs, FetchConfiguration fetch)
ResultObjectProvider
that can return all instances
of type
, optionally including subclasses as defined
by subclasses
.
The implementation of the result provider will typically execute
some sort of data store query to find all the applicable objects, loop
through the results, extracting object IDs from the data, and invoke
StoreContext.find(Object,FetchConfiguration,BitSet,Object,int)
on each OID. When invoking this method, the first argument is the OID.
The second is the given fetch configuration. The
third argument is a mask of fields to exclude from loading; it will
typically be null. The fourth argument is an object that will be passed
through to initialize(org.apache.openjpa.kernel.OpenJPAStateManager, org.apache.openjpa.kernel.PCState, org.apache.openjpa.kernel.FetchConfiguration, java.lang.Object)
or load(org.apache.openjpa.kernel.OpenJPAStateManager, java.util.BitSet, org.apache.openjpa.kernel.FetchConfiguration, int, java.lang.Object)
, and typically will
contain the actual data to load. For example, for a JDBC-based store
manager, this might be the result set that is being iterated over. If
this argument is null
, then the initialize(org.apache.openjpa.kernel.OpenJPAStateManager, org.apache.openjpa.kernel.PCState, org.apache.openjpa.kernel.FetchConfiguration, java.lang.Object)
or
load(org.apache.openjpa.kernel.OpenJPAStateManager, java.util.BitSet, org.apache.openjpa.kernel.FetchConfiguration, int, java.lang.Object)
method will have to issue another command to the data
store in order to fetch the data to be loaded.
executeExtent
in interface StoreManager
public StoreQuery newQuery(String language)
StoreManager
newQuery
in interface StoreManager
language
- the query languagepublic FetchConfiguration newFetchConfiguration()
StoreManager
FetchConfigurationImpl
.
newFetchConfiguration
in interface StoreManager
public int compareVersion(OpenJPAStateManager state, Object v1, Object v2)
v1
and v2
to Comparable
, and
invokes v1.compareTo (v2)
. If v1
is less
than v2
, returns StoreManager.VERSION_EARLIER
. If the same,
returns StoreManager.VERSION_SAME
. Otherwise, returns StoreManager.VERSION_LATER
. If either v1
or v2
are
null
, returns StoreManager.VERSION_DIFFERENT
.
compareVersion
in interface StoreManager
state
- the state manager for the objectv1
- the first version object to comparev2
- the second version object to compare
StoreManager.VERSION_LATER
if v1
is later than v2
StoreManager.VERSION_EARLIER
if v1
is earlier than v2
StoreManager.VERSION_SAME
if v1
is the same as v2
StoreManager.VERSION_DIFFERENT
if v1
is different from v2
, but the time
difference of the versions cannot be determinedpublic Seq getDataStoreIdSequence(ClassMetaData forClass)
getManagedType(java.lang.Object)
,
getDataStoreIdType(org.apache.openjpa.meta.ClassMetaData)
, copyDataStoreId(java.lang.Object, org.apache.openjpa.meta.ClassMetaData)
,
newDataStoreId(java.lang.Object, org.apache.openjpa.meta.ClassMetaData)
.
getDataStoreIdSequence
in interface StoreManager
public Seq getValueSequence(FieldMetaData forField)
getValueSequence
in interface StoreManager
public boolean cancelAll()
false
. If your data store supports
cancelling queries, this method should cancel any
currently-running queries and return true
if any
were cancelled.
cancelAll
in interface StoreManager
public void close()
StoreManager
close
in interface StoreManager
close
in interface Closeable
protected abstract Collection<Exception> flush(Collection<OpenJPAStateManager> pNew, Collection<OpenJPAStateManager> pNewUpdated, Collection<OpenJPAStateManager> pNewFlushedDeleted, Collection<OpenJPAStateManager> pDirty, Collection<OpenJPAStateManager> pDeleted)
OpenJPAConfiguration.OPTION_INC_FLUSH
option in
getUnsupportedOptions()
, this will be called only once at the
end of a transaction. Otherwise, it may be called periodically
throughout the course of a transaction.
If this store manager supports optimistic transactions, datastore
version information should be updated during flush, and the state
manager's version indicator should be updated through the
OpenJPAStateManager.setNextVersion(java.lang.Object)
method.
This method will only be invoked if there are meaningful changes
to store. This differs from the behavior of StoreManager.flush(java.util.Collection)
,
which may be invoked with a collection of objects in states that
do not require any datastore action (for example, objects in the
transient-transactional state).
pNew
- Objects that should be added to the store,
and that have not previously been flushed.pNewUpdated
- New objects that have been modified since
they were initially flushed. These were
in persistentNew
in an earlier flush invocation.pNewFlushedDeleted
- New objects that have been deleted since
they were initially flushed. These were
in persistentNew
in an earlier flush invocation.pDirty
- Objects that were loaded from the data
store and have since been modified.pDeleted
- Objects that were loaded from the data
store and have since been deleted. These
may have been in a previous flush invocation's persistentDirty list.
protected OpenJPAConfiguration newConfiguration()
protected Collection<String> getUnsupportedOptions()
OpenJPAConfiguration.OPTION_OPTIMISTIC
OpenJPAConfiguration.OPTION_ID_DATASTORE
OpenJPAConfiguration.OPTION_INC_FLUSH
OpenJPAConfiguration.OPTION_VALUE_AUTOASSIGN
OpenJPAConfiguration.OPTION_VALUE_INCREMENT
OpenJPAConfiguration.OPTION_DATASTORE_CONNECTION
protected String getPlatform()
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |