blob: 808a6d98c77a2bff4e565b0a8a78f8699134cb1a [file] [log] [blame]
/*
* Copyright 2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* PersistenceManager.java
*
*/
package javax.jdo;
import java.util.Collection;
import javax.jdo.datastore.JDOConnection;
import javax.jdo.datastore.Sequence;
import javax.jdo.listener.InstanceLifecycleListener;
/** <code>PersistenceManager</code> is the primary interface for JDO-aware application
* components. It is the factory for <code>Query</code> and <code>Transaction</code> instances,
* and contains methods to manage the life cycle of <code>PersistenceCapable</code>
* instances.
*
* <P>A <code>PersistenceManager</code> is obtained from the
* {@link PersistenceManagerFactory}
* (recommended) or by construction.
* @version 2.0
*/
public interface PersistenceManager {
/**
* A <code>PersistenceManager</code> instance can be used until it is closed.
* @return <code>true</code> if this <code>PersistenceManager</code> has been closed.
* @see #close()
*/
boolean isClosed ();
/** Close this <code>PersistenceManager</code> so that no further requests may be
* made on it. A <code>PersistenceManager</code> instance can be used
* only until it is closed.
*
* <P>Closing a <code>PersistenceManager</code> might release it to the pool of available
* <code>PersistenceManager</code>s, or might be garbage collected, at the option of
* the JDO implementation. Before being used again to satisfy a
* <code>getPersistenceManager()</code> request, the default values for options will
* be restored to their values as specified in the <code>PersistenceManagerFactory</code>.
*
* <P>This method closes the <code>PersistenceManager</code>.
*/
void close ();
/** Return the <code>Transaction</code> instance associated with a <code>PersistenceManager</code>.
* There is one <code>Transaction</code> instance associated with each <code>PersistenceManager</code>
* instance. The <code>Transaction</code> instance supports options as well as
* transaction completion requests.
* @return the <code>Transaction</code> associated with this
* <code>PersistenceManager</code>.
*/
Transaction currentTransaction();
/** Mark an instance as no longer needed in the cache.
* Eviction is normally done automatically by the <code>PersistenceManager</code>
* at transaction completion. This method allows the application to
* explicitly provide a hint to the <code>PersistenceManager</code> that the instance
* is no longer needed in the cache.
* @param pc the instance to evict from the cache.
*/
void evict (Object pc);
/** Mark an array of instances as no longer needed in the cache.
* @see #evict(Object pc)
* @param pcs the array of instances to evict from the cache.
*/
void evictAll (Object[] pcs);
/** Mark a <code>Collection</code> of instances as no longer needed in the cache.
* @see #evict(Object pc)
* @param pcs the <code>Collection</code> of instances to evict from the cache.
*/
void evictAll (Collection pcs);
/** Mark all persistent-nontransactional instances as no longer needed
* in the cache. It transitions
* all persistent-nontransactional instances to hollow. Transactional
* instances are subject to eviction based on the RetainValues setting.
* @see #evict(Object pc)
*/
void evictAll ();
/** Refresh the state of the instance from the data store.
*
* <P>In an optimistic transaction, the state of instances in the cache
* might not match the state in the data store. This method is used to
* reload the state of the instance from the data store so that a subsequent
* commit is more likely to succeed.
* <P>Outside a transaction, this method will refresh nontransactional state.
* @param pc the instance to refresh.
*/
void refresh (Object pc);
/** Refresh the state of an array of instances from the data store.
*
* @see #refresh(Object pc)
* @param pcs the array of instances to refresh.
*/
void refreshAll (Object[] pcs);
/** Refresh the state of a <code>Collection</code> of instances from the data store.
*
* @see #refresh(Object pc)
* @param pcs the <code>Collection</code> of instances to refresh.
*/
void refreshAll (Collection pcs);
/** Refresh the state of all applicable instances from the data store.
* <P>If called with an active transaction, all transactional instances
* will be refreshed. If called outside an active transaction, all
* nontransactional instances will be refreshed.
* @see #refresh(Object pc)
*/
void refreshAll ();
/**
* Refreshes all instances in the exception that failed verification.
*
* @since 2.0
*/
void refreshAll (JDOException jdoe);
/** Create a new <code>Query</code> with no elements.
* @return the new <code>Query</code>.
*/
Query newQuery ();
/** Create a new <code>Query</code> using elements from another <code>Query</code>.
* The other <code>Query</code> must have been created by the same JDO implementation.
* It might be active
* in a different <code>PersistenceManager</code> or might have been serialized and restored.
* <P>All of the settings of the other <code>Query</code> are copied to this <code>Query</code>,
* except for the candidate <code>Collection</code> or <code>Extent</code>.
* @return the new <code>Query</code>
* @param compiled another <code>Query</code> from the same JDO implementation
*/
Query newQuery (Object compiled);
/** Create a Construct a new query instance using the specified String
* as the single-string representation of the query.
* @param query the single-string query
* @return the new <code>Query</code>
* @since 2.0
*/
Query newQuery (String query);
/** Create a new <code>Query</code> using the specified language.
* @param language the language of the query parameter
* @param query the query, which is of a form determined by the language
* @return the new <code>Query</code>
*/
Query newQuery (String language, Object query);
/** Create a new <code>Query</code> specifying the <code>Class</code> of the candidate instances.
* @param cls the <code>Class</code> of the candidate instances
* @return the new <code>Query</code>
*/
Query newQuery (Class cls);
/** Create a new <code>Query</code> with the <code>Class</code> of the
* candidate instances and candidate <code>Extent</code>.
* @param cln the <code>Extent</code> of candidate instances
* @return the new <code>Query</code>
*/
Query newQuery (Extent cln);
/** Create a new <code>Query</code> with the candidate <code>Class</code>
* and <code>Collection</code>.
* @param cls the <code>Class</code> of results
* @param cln the <code>Collection</code> of candidate instances
* @return the new <code>Query</code>
*/
Query newQuery (Class cls, Collection cln);
/** Create a new <code>Query</code> with the <code>Class</code> of the
* candidate instances and filter.
* @param cls the <code>Class</code> of results
* @param filter the filter for candidate instances
* @return the new <code>Query</code>
*/
Query newQuery (Class cls, String filter);
/** Create a new <code>Query</code> with the <code>Class</code> of the candidate instances,
* candidate <code>Collection</code>, and filter.
* @param cls the <code>Class</code> of candidate instances
* @param cln the <code>Collection</code> of candidate instances
* @param filter the filter for candidate instances
* @return the new <code>Query</code>
*/
Query newQuery (Class cls, Collection cln, String filter);
/** Create a new <code>Query</code> with the
* candidate <code>Extent</code> and filter; the class
* is taken from the <code>Extent</code>.
* @param cln the <code>Extent</code> of candidate instances
* @param filter the filter for candidate instances
* @return the new <code>Query</code>
*/
Query newQuery (Extent cln, String filter);
/**
* Create a new <code>Query</code> with the given candidate class
* from a named query. The query name given must be the name of a
* query defined in metadata.
* @param cls the <code>Class</code> of candidate instances
* @param queryName the name of the query to look up in metadata
* @return the new <code>Query</code>
*/
Query newNamedQuery (Class cls, String queryName);
/** The <code>PersistenceManager</code> manages a collection of instances in the data
* store based on the class of the instances. This method returns an
* <code>Extent</code> of instances in the data store that might be iterated or
* given to a <code>Query</code>. The <code>Extent</code> itself might not reference any
* instances, but only hold the class name and an
* indicator as to whether subclasses are included in the <code>Extent</code>.
* <P>Note that the <code>Extent</code> might be very large.
* @param persistenceCapableClass <code>Class</code> of instances
* @param subclasses whether to include instances of subclasses
* @return an <code>Extent</code> of the specified <code>Class</code>
* @see Query
*/
Extent getExtent (Class persistenceCapableClass, boolean subclasses);
/**
* Equivalent to <code>getExtent (persistenceCapableClass,
* true)</code>.
* @see #getExtent(Class,boolean)
* @since 2.0
*/
Extent getExtent (Class persistenceCapableClass);
/** This method locates a persistent instance in the cache of instances
* managed by this <code>PersistenceManager</code>.
* The <code>getObjectById</code> method attempts
* to find an instance in the cache with the specified JDO identity.
* The <code>oid</code> parameter object might have been returned by an earlier call
* to <code>getObjectId</code> or <code>getTransactionalObjectId</code>,
* or might have been constructed by the application.
* <P>If the <code>PersistenceManager</code> is unable to resolve the <code>oid</code> parameter
* to an ObjectId instance, then it throws a <code>JDOUserException</code>.
* <P>If the <code>validate</code> flag is <code>false</code>, and there is already an instance in the
* cache with the same JDO identity as the <code>oid</code> parameter, then this method
* returns it. There is no change made to the state of the returned
* instance.
* <P>If there is not an instance already in the cache with the same JDO
* identity as the <code>oid</code> parameter, then this method creates an instance
* with the specified JDO identity and returns it. If there is no
* transaction in progress, the returned instance will be hollow or
* persistent-nontransactional, at the choice of the implementation.
* <P>If there is a transaction in progress, the returned instance will
* be hollow, persistent-nontransactional, or persistent-clean, at the
* choice of the implementation.
* <P>It is an implementation decision whether to access the data store,
* if required to determine the exact class. This will be the case of
* inheritance, where multiple <code>PersistenceCapable</code> classes share the
* same ObjectId class.
* <P>If the validate flag is <code>false</code>, and the instance does not exist in
* the data store, then this method might not fail. It is an
* implementation choice whether to fail immediately with a
* <code>JDOObjectNotFoundException</code>. But a subsequent access
* of the fields of the
* instance will throw a <code>JDOObjectNotFoundException</code>
* if the instance does not
* exist at that time. Further, if a relationship is established to this
* instance, then the transaction in which the association was made will
* fail.
* <P>If the <code>validate</code> flag is <code>true</code>, and there is already a transactional
* instance in the cache with the same JDO identity as the <code>oid</code> parameter,
* then this method returns it. There is no change made to the state of
* the returned instance.
* <P>If there is an instance already in the cache with the same JDO
* identity as the <code>oid</code> parameter, but the instance is not transactional,
* then it must be verified in the data store. If the instance does not
* exist in the datastore, then a <code>JDOObjectNotFoundException</code>
* is thrown.
* <P>If there is not an instance already in the cache with the same JDO
* identity as the <code>oid</code> parameter, then this method creates an instance
* with the specified JDO identity, verifies that it exists in the data
* store, and returns it. If there is no transaction in progress, the
* returned instance will be hollow or persistent-nontransactional,
* at the choice of the implementation.
* <P>If there is a data store transaction in progress, the returned
* instance will be persistent-clean.
* If there is an optimistic transaction in progress, the returned
* instance will be persistent-nontransactional.
* @see #getObjectId(Object pc)
* @see #getTransactionalObjectId(Object pc)
* @return the <code>PersistenceCapable</code> instance with the specified ObjectId
* @param oid an ObjectId
* @param validate if the existence of the instance is to be validated
*/
Object getObjectById (Object oid, boolean validate);
/**
* Looks up the instance of the given type with the given key.
* @param cls The type of object to load
* @param key either the string representation of the object id, or
* an object representation of a single field identity key
* @return the corresponding persistent instance
* @since 2.0
*/
Object getObjectById (Class cls, Object key);
/**
* Looks up the instance corresponding to the specified oid. This is
* equivalent to <code>getObjectById(oid, true);
* @param oid The object id of the object to load
* @return the corresponding persistent instance
*/
Object getObjectById (Object oid);
/** The ObjectId returned by this method represents the JDO identity of
* the instance. The ObjectId is a copy (clone) of the internal state
* of the instance, and changing it does not affect the JDO identity of
* the instance.
* <P>The <code>getObjectId</code> method returns an ObjectId instance that represents
* the object identity of the specified JDO instance. The identity is
* guaranteed to be unique only in the context of the JDO
* <code>PersistenceManager</code> that created the identity, and only for two types
* of JDO Identity: those that are managed by the application, and
* those that are managed by the data store.
* <P>If the object identity is being changed in the transaction, by the
* application modifying one or more of the application key fields,
* then this method returns the identity as of the beginning of the
* transaction. The value returned by <code>getObjectId</code> will be different
* following <code>afterCompletion</code> processing for successful transactions.
* <P>Within a transaction, the ObjectId returned will compare equal to
* the ObjectId returned by only one among all JDO instances associated
* with the <code>PersistenceManager</code> regardless of the type of ObjectId.
* <P>The ObjectId does not necessarily contain any internal state of the
* instance, nor is it necessarily an instance of the class used to
* manage identity internally. Therefore, if the application makes a
* change to the ObjectId instance returned by this method, there is
* no effect on the instance from which the ObjectId was obtained.
* <P>The <code>getObjectById</code> method can be used between instances of
* <code>PersistenceManager</code> of different JDO vendors only for instances of
* persistence capable classes using application-managed (primary key)
* JDO identity. If it is used for instances of classes using datastore
* identity, the method might succeed, but there are no guarantees that
* the parameter and return instances are related in any way.
* @see #getTransactionalObjectId(Object pc)
* @see #getObjectById(Object oid, boolean validate)
* @param pc the <code>PersistenceCapable</code> instance
* @return the ObjectId of the instance
*/
Object getObjectId (Object pc);
/** The ObjectId returned by this method represents the JDO identity of
* the instance. The ObjectId is a copy (clone) of the internal state
* of the instance, and changing it does not affect the JDO identity of
* the instance.
* <P>If the object identity is being changed in the transaction, by the
* application modifying one or more of the application key fields,
* then this method returns the current identity in the transaction.
* <P>If there is no transaction in progress, or if none of the key fields
* is being modified, then this method will return the same value as
* <code>getObjectId</code>.
* @see #getObjectId(Object pc)
* @see #getObjectById(Object oid, boolean validate)
* @param pc a <code>PersistenceCapable</code> instance
* @return the ObjectId of the instance
*/
Object getTransactionalObjectId (Object pc);
/**
* This method returns an object id instance corresponding to the pcClass
* and key arguments.
* @param pcClass the <code>Class</code> of the persistence-capable instance
* @param key for single-field identity, the parameter for the
* constructor; for non-single-field application identity, the result
* of toString() on the object id instance.
* @return an instance of the object identity class
*/
Object newObjectIdInstance (Class pcClass, Object key);
/**
* Return the objects with the given oids.
* @param oids the oids of the objects to return
* @param validate if true, the existance of the objects in
* the datastore will be validated.
* @return the objects that were looked up, in the
* same order as the oids parameter.
* @see #getObjectById(Object,boolean)
* @since 2.0
*/
Collection getObjectsById (Collection oids, boolean validate);
/**
* Return the objects with the given oids. This method is equivalent
* to calling {@link #getObjectsById(Collection, boolean)}
* with the validate flag true.
* @param oids the oids of the objects to return
* @return the objects that were looked up, in the
* same order as the oids parameter.
* @see #getObjectsById(Collection,boolean)
* @since 2.0
*/
Collection getObjectsById (Collection oids);
/**
* Return the objects with the given oids.
* @param oids the oids of the objects to return
* @param validate if true, the existance of the objects in
* the datastore will be validated.
* @return the objects that were looked up, in the
* same order as the oids parameter.
* @see #getObjectById(Object,boolean)
* @since 2.0
*/
Object[] getObjectsById (Object[] oids, boolean validate);
/**
* Return the objects with the given oids. This method is equivalent
* to calling {@link #getObjectsById(Object[],boolean)}
* with the validate flag true.
* @param oids the oids of the objects to return
* @return the objects that were looked up, in the
* same order as the oids parameter.
* @see #getObjectsById(Object[],boolean)
* @since 2.0
*/
Object[] getObjectsById (Object[] oids);
/** Make the parameter instance persistent in this
* <code>PersistenceManager</code>.
* This method makes transient instances persistent and applies detached
* instance changes to the cache. It must be called in the context of
* an active transaction, or a JDOUserException is thrown. For a transient
* instance, it assigns an object identity to the instance and transitions
* it to persistent-new. Any transient instances reachable from this
* instance via persistent fields of this instance become provisionally
* persistent, transitively. That is, they behave as persistent-new
* instances (return true to isPersistent, isNew, and isDirty).
* But at commit time, the reachability algorithm is run again,
* and instances made provisionally persistent that are not then
* reachable from persistent instances will revert to transient.
* <P>During makePersistent of transient instances, the create life cycle
* listener is called.
* <P>For detached instances, it locates or instantiates a persistent
* instance with the same JDO identity as the detached instance,
* and merges the persistent state of the detached instance into the
* persistent instance. Only the state of persistent fields is merged.
* If non-persistent state needs to be copied, the application should
* use the jdoPostAttach callback or the postAttach lifecycle event
* listener. Any references to the detached instances from instances
* in the closure of the parameter instances are modified to refer to
* the corresponding persistent instance instead of to the
* detached instance.
* <P>During attachment of detached instances, the attach callbacks
* and attach life cycle listeners are called.
* <P>During application of changes of the detached state, if the JDO
* implementation can determine that there were no changes made during
* detachment, then the implementation is not required to mark the
* corresponding instance dirty. If it cannot determine if changes
* were made, then it must mark the instance dirty.
* No consistency checking is done during makePersistent of detached
* instances. If consistency checking is required by the application,
* then flush or checkConsistency should be called after attaching the
* instances.
* <P>These methods have no effect on parameter persistent instances
* already managed by this PersistenceManager. They will throw a
* JDOUserException if the parameter instance is managed by a
* different PersistenceManager.
* If an instance is of a class whose identity type (application,
* datastore, or none) is not supported by the JDO implementation,
* then a JDOUserException will be thrown for that instance.
* The return value for parameter instances in the transient or persistent
* states is the same as the parameter value. The return value for
* parameter instances in the detached state is the persistent instance
* corresponding to the detached instance.
* The return values for makePersistentAll methods correspond by position
* to the parameter instances.
* @param pc an instance of a <code>Class</code> that is persistent
* capable.
* @return the parameter instance for parameters in the transient or
* persistent state, or the corresponding persistent instance
* for detached parameter instances
*/
Object makePersistent (Object pc);
/** Make an array of instances persistent.
* @param pcs an array of instances
* @return the parameter instances for parameters in the transient or
* persistent state, or the corresponding persistent instance
* for detached parameter instances, in the same order as in the
* parameter array
* @see #makePersistent(Object pc)
*/
Object[] makePersistentAll (Object[] pcs);
/** Make a <code>Collection</code> of instances persistent.
* @param pcs a <code>Collection</code> of instances
* @return the parameter instance for parameters in the transient or
* persistent state, or the corresponding persistent instance
* for detached parameter instances, with an iteration in the same order
* as in the parameter Collection
* @see #makePersistent(Object pc)
*/
Collection makePersistentAll (Collection pcs);
/** Delete the persistent instance from the data store.
* This method must be called in an active transaction.
* The data store object will be removed at commit.
* Unlike <code>makePersistent</code>, which makes the closure of the instance persistent,
* the closure of the instance is not deleted from the data store.
* This method has no effect if the instance is already deleted in the
* current transaction.
* This method throws <code>JDOUserException</code> if the instance is transient or
* is managed by another <code>PersistenceManager</code>.
*
* @param pc a persistent instance
*/
void deletePersistent (Object pc);
/** Delete an array of instances from the data store.
* @param pcs a <code>Collection</code> of persistent instances
* @see #deletePersistent(Object pc)
*/
void deletePersistentAll (Object[] pcs);
/** Delete a <code>Collection</code> of instances from the data store.
* @param pcs a <code>Collection</code> of persistent instances
* @see #deletePersistent(Object pc)
*/
void deletePersistentAll (Collection pcs);
/** Make an instance transient, removing it from management by this
* <code>PersistenceManager</code>.
*
* <P>The instance loses its JDO identity and it is no longer associated
* with any <code>PersistenceManager</code>. The state of fields is preserved unchanged.
* @param pc the instance to make transient.
*/
void makeTransient (Object pc);
/** Make an array of instances transient, removing them from management by this
* <code>PersistenceManager</code>.
*
* <P>The instances lose their JDO identity and they are no longer associated
* with any <code>PersistenceManager</code>. The state of fields is preserved unchanged.
* @param pcs the instances to make transient.
*/
void makeTransientAll (Object[] pcs);
/** Make a <code>Collection</code> of instances transient, removing them from
* management by this <code>PersistenceManager</code>.
*
* <P>The instances lose their JDO identity and they are no longer associated
* with any <code>PersistenceManager</code>. The state of fields is preserved unchanged.
* @param pcs the instances to make transient.
*/
void makeTransientAll (Collection pcs);
/** Make an instance subject to transactional boundaries.
*
* <P>Transient instances normally do not observe transaction boundaries.
* This method makes transient instances sensitive to transaction completion.
* If an instance is modified in a transaction, and the transaction rolls back,
* the state of the instance is restored to the state before the first change
* in the transaction.
*
* <P>For persistent instances read in optimistic transactions, this method
* allows the application to make the state of the instance part of the
* transactional state. At transaction commit, the state of the instance in
* the cache is compared to the state of the instance in the data store. If they
* are not the same, then an exception is thrown.
* @param pc the instance to make transactional.
*/
void makeTransactional (Object pc);
/** Make an array of instances subject to transactional boundaries.
* @param pcs the array of instances to make transactional.
* @see #makeTransactional(Object pc)
*/
void makeTransactionalAll (Object[] pcs);
/** Make a <code>Collection</code> of instances subject to transactional boundaries.
* @param pcs the <code>Collection</code> of instances to make transactional.
* @see #makeTransactional(Object pc)
*/
void makeTransactionalAll (Collection pcs);
/** Make an instance non-transactional after commit.
*
* <P>Normally, at transaction completion, instances are evicted from the
* cache. This method allows an application to identify an instance as
* not being evicted from the cache at transaction completion. Instead,
* the instance remains in the cache with nontransactional state.
*
* @param pc the instance to make nontransactional.
*/
void makeNontransactional (Object pc);
/** Make an array of instances non-transactional after commit.
*
* @param pcs the array of instances to make nontransactional.
* @see #makeNontransactional(Object pc)
*/
void makeNontransactionalAll (Object[] pcs);
/** Make a <code>Collection</code> of instances non-transactional after commit.
*
* @param pcs the <code>Collection</code> of instances to make nontransactional.
* @see #makeNontransactional(Object pc)
*/
void makeNontransactionalAll (Collection pcs);
/** Retrieve field values of an instance from the store. This tells
* the <code>PersistenceManager</code> that the application intends to use the
* instance, and its field values must be retrieved.
* <P>The <code>PersistenceManager</code> might use policy information about the
* class to retrieve associated instances.
* @param pc the instance
*/
void retrieve (Object pc);
/** Retrieve field values of an instance from the store. This tells
* the <code>PersistenceManager</code> that the application intends to use the
* instance, and its field values must be retrieved.
* <P>The <code>PersistenceManager</code> might use policy information about the
* class to retrieve associated instances.
* @param pc the instance
* @param FGOnly whether to only retrieve the fields in the current fetch group
* @since 2.0
*/
void retrieve (Object pc, boolean FGOnly);
/** Retrieve field values of instances from the store. This tells
* the <code>PersistenceManager</code> that the application intends to use the
* instances, and all field values must be retrieved.
* <P>The <code>PersistenceManager</code> might use policy information about the
* class to retrieve associated instances.
* @param pcs the instances
*/
void retrieveAll (Collection pcs);
/** Retrieve field values of instances from the store. This tells
* the <code>PersistenceManager</code> that the application intends to use the
* instances, and their field values should be retrieved. The fields
* in the current fetch group must be retrieved, and the implementation
* might retrieve more fields than the current fetch group.
* <P>The <code>PersistenceManager</code> might use policy information about the
* class to retrieve associated instances.
* @param pcs the instances
* @param FGOnly whether to retrieve only the fields in the current fetch group
* @since 1.0.1
*/
void retrieveAll (Collection pcs, boolean FGOnly);
/** Retrieve field values of instances from the store. This tells
* the <code>PersistenceManager</code> that the application intends to use the
* instances, and all field values must be retrieved.
* <P>The <code>PersistenceManager</code> might use policy information about the
* class to retrieve associated instances.
* @param pcs the instances
*/
void retrieveAll (Object[] pcs);
/** Retrieve field values of instances from the store. This tells
* the <code>PersistenceManager</code> that the application intends to use the
* instances, and their field values should be retrieved. The fields
* in the current fetch group must be retrieved, and the implementation
* might retrieve more fields than the current fetch group.
* <P>The <code>PersistenceManager</code> might use policy information about the
* class to retrieve associated instances.
* @param pcs the instances
* @param FGOnly whether to retrieve only the fields in the current fetch group
* @since 1.0.1
*/
void retrieveAll (Object[] pcs, boolean FGOnly);
/** The application can manage the <code>PersistenceManager</code> instances
* more easily by having an application object associated with each
* <code>PersistenceManager</code> instance.
* @param o the user instance to be remembered by the <code>PersistenceManager</code>
* @see #getUserObject
*/
void setUserObject (Object o);
/** The application can manage the <code>PersistenceManager</code> instances
* more easily by having an application object associated with each
* <code>PersistenceManager</code> instance.
* @return the user object associated with this <code>PersistenceManager</code>
* @see #setUserObject
*/
Object getUserObject ();
/** This method returns the <code>PersistenceManagerFactory</code> used to create
* this <code>PersistenceManager</code>.
* @return the <code>PersistenceManagerFactory</code> that created
* this <code>PersistenceManager</code>
*/
PersistenceManagerFactory getPersistenceManagerFactory();
/** Return the <code>Class</code> that implements the JDO Identity for the
* specified <code>PersistenceCapable</code> class. The application can use the
* returned <code>Class</code> to construct a JDO Identity instance for
* application identity <code>PersistenceCapable</code> classes. This JDO Identity
* instance can then be used to get an instance of the
* <code>PersistenceCapable</code> class for use in the application.
*
* <P>In order for the application to construct an instance of the ObjectId class
* it needs to know the class being used by the JDO implementation.
* @param cls the <code>PersistenceCapable Class</code>
* @return the <code>Class</code> of the ObjectId of the parameter
* @see #getObjectById
*/
Class getObjectIdClass(Class cls);
/** Set the Multithreaded flag for this <code>PersistenceManager</code>. Applications
* that use multiple threads to invoke methods or access fields from
* instances managed by this <code>PersistenceManager</code> must set this flag to <code>true</code>.
* Instances managed by this <code>PersistenceManager</code> include persistent or
* transactional instances of <code>PersistenceCapable</code> classes, as well as
* helper instances such as <code>Query</code>, <code>Transaction</code>, or <code>Extent</code>.
* @param flag the Multithreaded setting.
*/
void setMultithreaded (boolean flag);
/** Get the current Multithreaded flag for this <code>PersistenceManager</code>.
* @see #setMultithreaded
* @return the Multithreaded setting.
*/
boolean getMultithreaded();
/** Set the ignoreCache parameter for queries.
*
* <P>IgnoreCache set to <code>true</code> specifies that for all <code>Query</code> instances created by this
* <code>PersistenceManager</code>, the default is the cache should be ignored for queries.
* @param flag the ignoreCache setting.
*/
void setIgnoreCache(boolean flag);
/** Get the ignoreCache setting for queries.
*
* <P>IgnoreCache set to <code>true</code> specifies that for all <code>Query</code> instances created by this
* <code>PersistenceManager</code>, the default is the cache should be ignored for queries.
* @return the ignoreCache setting.
*/
boolean getIgnoreCache();
/** Gets the detachAllOnCommit setting.
* @see #setDetachAllOnCommit(boolean)
* @since 2.0
* @return the detachAllOnCommit setting.
*/
boolean getDetachAllOnCommit();
/** Sets the detachAllOnCommit setting.
*
* <P>DetachAllOnCommit set to <code>false</code> specifies that the
* state of persistent instances in the cache after commit is defined
* by the <code>retainValues</code> flag. With this flag set to true,
* during beforeCompletion all cached instances are prepared for
* detachment according to the fetch plan in effect at commit. Loading
* fields and unloading fields required by the fetch plan is done after
* calling the user's <code>beforeCompletion</code> callback. During
* <code>afterCompletion</code>, before calling the user's
* <code>afterCompletion</code> callback, all detachable persistent
* instances in the cache transition to detached; non-detachable
* persistent instances transition to transient; and detachable
* instances can be serialized as detached instances. Transient
* transactional instances are unaffected by this flag.
*
* @see #getDetachAllOnCommit()
* @since 2.0
*/
void setDetachAllOnCommit(boolean flag);
/**
* Detach the specified object from the <code>PersistenceManager</code>.
* @param pc the instance to detach
* @return the detached instance
* @see #detachCopyAll(Object[])
* @since 2.0
*/
Object detachCopy (Object pc);
/**
* Detach the specified objects from the <code>PersistenceManager</code>.
* @param pcs the instances to detach
* @return the detached instances
* @see #detachCopyAll(Object[])
* @since 2.0
*/
Collection detachCopyAll (Collection pcs);
/**
* Detach the specified objects from the
* <code>PersistenceManager</code>. The objects returned can be
* manipulated and re-attached with
* {@link #attachCopyAll(Object[], boolean)}.
* The detached instances will be
* unmanaged copies of the specified parameters, and are suitable
* for serialization and manipulation outside of a JDO
* environment. When detaching instances, only fields in the
* current {@link FetchPlan} will be traversed. Thus, to detach a
* graph of objects, relations to other persistent instances must
* either be in the <code>default-fetch-group</code>, or in the
* current custom {@link FetchPlan}.
* @param pcs the instances to detach
* @return the detached instances
* @throws JDOUserException if any of the instances do not
* @see #attachCopyAll(Object[], boolean)
* @see #getFetchPlan
* @since 2.0
*/
Object[] detachCopyAll (Object [] pcs);
/**
* Import the specified object into the
* <code>PersistenceManager</code>.
* @param pc instance to import
* @param makeTransactional if <code>true</code>, this method will
* mark transactional the persistent instances corresponding
* to all instances in the closure of the detached graph.
* @return the re-attached instance
* @see #attachCopyAll(Object[],boolean)
* @since 2.0
*/
Object attachCopy (Object pc, boolean makeTransactional);
/**
* Import the specified objects into the
* <code>PersistenceManager</code>.
* @param pcs Collection of instances to import
* @param makeTransactional if <code>true</code>, this method will
* mark transactional the persistent instances corresponding
* to all instances in the closure of the detached graph.
* @return the re-attached instances
* @see #attachCopyAll(Object[],boolean)
* @since 2.0
*/
Collection attachCopyAll (Collection pcs, boolean makeTransactional);
/**
* Import the specified objects into the
* <code>PersistenceManager</code>. Instances that were
* previously detached from this or another
* <code>PersistenceManager</code> will have their changed merged
* into the persistent instances. Instances that are new will be
* persisted as new instances.
* @param pcs array of instances to import
* @param makeTransactional if <code>true</code>, this method will
* mark transactional the persistent instances corresponding
* to all instances in the closure of the detached graph.
* @return the re-attached instances
* @see #detachCopyAll(Object[])
* @since 2.0
*/
Object[] attachCopyAll (Object[] pcs, boolean makeTransactional);
/**
* Put the specified key-value pair into the map of user objects.
* @since 2.0
*/
Object putUserObject (Object key, Object val);
/**
* Get the value for the specified key from the map of user objects.
* @param key the key of the object to be returned
* @return the object
* @since 2.0
*/
Object getUserObject (Object key);
/**
* Remove the specified key and its value from the map of user objects.
* @param key the key of the object to be removed
* @since 2.0
*/
Object removeUserObject (Object key);
/**
* Flushes all dirty, new, and deleted instances to the data
* store. It has no effect if a transaction is not active.
* <p>If a datastore transaction is active, this method
* synchronizes the cache with the datastore and reports any
* exceptions.</p>
* <p>If an optimistic transaction is active, this method obtains
* a datastore connection, synchronizes the cache with the
* datastore using this connection and reports any
* exceptions. The connection obtained by this method is held
* until the end of the transaction.</p>
* <p>If exceptions occur during flush, the implementation will
* set the current transaction's <code>RollbackOnly</code> flag
* (see {@link Transaction#setRollbackOnly}).</p>
* @since 2.0
*/
void flush ();
/**
* Validates the <code>PersistenceManager</code> cache with the
* datastore. This method has no effect if a transaction is not
* active.
* <p>If a datastore transaction is active, this method verifies
* the consistency of instances in the cache against the
* datastore. An implementation might flush instances as if
* {@link #flush} were called, but it is not required to do
* so.</p>
* <p>If an optimistic transaction is active, this method obtains
* a datastore connection and verifies the consistency of the
* instances in the cache against the datastore. If any
* inconsistencies are detected, a {@link
* JDOOptimisticVerificationException} is thrown. This exception
* contains a nested {@link JDOOptimisticVerificationException}
* for each object that failed the consistency check. No
* datastore resources acquired during the execution of this
* method are held beyond the scope of this method.</p>
* @since 2.0
*/
void checkConsistency ();
/**
* Returns the <code>FetchPlan</code> used by this
* <code>PersistenceManager</code>.
* @return the FetchPlan
* @since 2.0
*/
FetchPlan getFetchPlan ();
/**
* Creates an instance of a persistence-capable interface or
* abstract class. The returned instance is transient.
* @param pcClass Must be an abstract class or interface
* that is declared in the metadata.
* @return the created instance
* @since 2.0
*/
Object newInstance (Class pcClass);
/**
* Returns the sequence identified by <code>name</code>.
* @param name the name of the Sequence
* @return the Sequence
* @since 2.0
*/
Sequence getSequence (String name);
/**
* If this method is called while a datastore transaction is
* active, the object returned will be enlisted in the current
* transaction. If called in an optimistic transaction or outside
* an active transaction, the object returned will not be
* enlisted in any transaction.
* @return the JDOConnection instance
* @since 2.0
*/
JDOConnection getDataStoreConnection ();
/**
* Adds the listener instance to the list of lifecycle event
* listeners. The <code>classes</code> parameter identifies all
* of the classes of interest. If the <code>classes</code>
* parameter is specified as <code>null</code>, events for all
* persistent classes and interfaces will be sent to
* <code>listenerInstance</code>.
* <p>The listenerInstance will be called for each event for which it
* implements the corresponding listenerInstance interface.</p>
* @param listener the lifecycle listener
* @param classes the classes of interest to the listener
* @since 2.0
*/
void addInstanceLifecycleListener (InstanceLifecycleListener listener,
Class[] classes);
/**
* Removes the listener instance from the list of lifecycle event listeners.
* @param listener the listener instance to be removed
* @since 2.0
*/
void removeInstanceLifecycleListener (InstanceLifecycleListener listener);
}