org.qi4j.api.unitofwork
Interface UnitOfWork


public interface UnitOfWork

All operations on entities goes through an UnitOfWork.

A UnitOfWork allows you to access Entities and work with them. All modifications to Entities are recorded by the UnitOfWork, and at the end they may be sent to the underlying EntityStore by calling complete(). If the UoW was read-only you may instead simply discard() it.

A UoW differs from a traditional Transaction in the sense that it is not tied at all to the underlying storage resource. Because of this there is no timeout on a UoW. It can be very short or very long. Another difference is that if a call to complete() fails, and the cause is validation errors in the Entities of the UoW, then these can be corrected and the UoW retried. By contrast, when a Transaction commit fails, then the whole transaction has to be done from the beginning again.

A UoW can be associated with a Usecase. A Usecase describes the metainformation about the process to be performed by the UoW.


Method Summary
 void addUnitOfWorkCallback(UnitOfWorkCallback callback)
          Register a callback.
 void complete()
          Complete this UnitOfWork.
 void discard()
          Discard thie UnitOfWork.
<T> T
get(Class<T> type, String identity)
          Find an Entity of the given mixin type with the give identity.
<T> T
get(T entity)
          If you have a reference to an Entity from another UnitOfWork and want to create a reference to it in this UnitOfWork, then call this method.
 boolean isOpen()
          Check if the UnitOfWork is open.
 boolean isPaused()
          Check if the UnitOfWork is paused.
 MetaInfo metaInfo()
          Get the MetaInfo for this UnitOfWork.
<T> T
newEntity(Class<T> type)
          Create a new Entity which implements the given mixin type.
<T> T
newEntity(Class<T> type, String identity)
          Create a new Entity which implements the given mixin type.
<T> EntityBuilder<T>
newEntityBuilder(Class<T> type)
          Create a new EntityBuilder for an EntityComposite which implements the given mixin type.
<T> EntityBuilder<T>
newEntityBuilder(Class<T> type, String identity)
          Create a new EntityBuilder for an EntityComposite which implements the given mixin type.
 void pause()
          Pauses this UnitOfWork.
 void remove(Object entity)
          Remove the given Entity.
 void removeUnitOfWorkCallback(UnitOfWorkCallback callback)
           
 void resume()
          Resumes this UnitOfWork to again become the current UnitOfWork.
 UnitOfWorkFactory unitOfWorkFactory()
          Get the UnitOfWorkFactory that this UnitOfWork was created from.
 Usecase usecase()
          Get the Usecase for this UnitOfWork
 

Method Detail

unitOfWorkFactory

UnitOfWorkFactory unitOfWorkFactory()
Get the UnitOfWorkFactory that this UnitOfWork was created from.

Returns:
The UnitOfWorkFactory instance that was used to create this UnitOfWork.

usecase

Usecase usecase()
Get the Usecase for this UnitOfWork

Returns:
the Usecase

metaInfo

MetaInfo metaInfo()
Get the MetaInfo for this UnitOfWork. This can be used to associate arbitrary information with this UnitOfWork.

Returns:
the MetaInfo

newEntity

<T> T newEntity(Class<T> type)
            throws EntityTypeNotFoundException,
                   LifecycleException
Create a new Entity which implements the given mixin type. An EntityComposite will be chosen according to what has been registered and the visibility rules for Modules and Layers will be considered. If several EntityComposites implement the type then an AmbiguousTypeException will be thrown.

The identity of the Entity will be generated by the IdentityGenerator of the Module of the EntityComposite.

Parameters:
type - the mixin type that the EntityComposite must implement
Returns:
a new Entity
Throws:
NoSuchEntityException - if no EntityComposite type of the given mixin type has been registered
LifecycleException - if the entity cannot be created
EntityTypeNotFoundException

newEntity

<T> T newEntity(Class<T> type,
                String identity)
            throws EntityTypeNotFoundException,
                   LifecycleException
Create a new Entity which implements the given mixin type. An EntityComposite will be chosen according to what has been registered and the visibility rules for Modules and Layers will be considered. If several EntityComposites implement the type then an AmbiguousTypeException will be thrown.

Parameters:
type - the mixin type that the EntityComposite must implement
identity - the identity of the new Entity
Returns:
a new Entity
Throws:
NoSuchEntityException - if no EntityComposite type of the given mixin type has been registered
LifecycleException - if the entity cannot be created
EntityTypeNotFoundException

newEntityBuilder

<T> EntityBuilder<T> newEntityBuilder(Class<T> type)
                                  throws EntityTypeNotFoundException
Create a new EntityBuilder for an EntityComposite which implements the given mixin type. An EntityComposite will be chosen according to what has been registered and the visibility rules for Modules and Layers will be considered. If several EntityComposites implement the type then an AmbiguousTypeException will be thrown.

Parameters:
type - the mixin type that the EntityComposite must implement
Returns:
a new Entity
Throws:
NoSuchEntityException - if no EntityComposite type of the given mixin type has been registered
LifecycleException
EntityTypeNotFoundException

newEntityBuilder

<T> EntityBuilder<T> newEntityBuilder(Class<T> type,
                                      String identity)
                                  throws EntityTypeNotFoundException
Create a new EntityBuilder for an EntityComposite which implements the given mixin type. An EntityComposite will be chosen according to what has been registered and the visibility rules for Modules and Layers will be considered. If several mixins implement the type then an AmbiguousTypeException will be thrown.

Parameters:
type - the mixin type that the EntityComposite must implement
identity - the identity of the new Entity
Returns:
a new Entity
Throws:
NoSuchEntityException - if no EntityComposite type of the given mixin type has been registered
LifecycleException
EntityTypeNotFoundException

get

<T> T get(Class<T> type,
          String identity)
      throws EntityTypeNotFoundException,
             NoSuchEntityException
Find an Entity of the given mixin type with the give identity. This method verifies that it exists by asking the underlying EntityStore.

Parameters:
type - of the entity
identity - of the entity
Returns:
the entity
Throws:
EntityTypeNotFoundException - if no entity type could be found
NoSuchEntityException

get

<T> T get(T entity)
      throws EntityTypeNotFoundException
If you have a reference to an Entity from another UnitOfWork and want to create a reference to it in this UnitOfWork, then call this method.

Parameters:
entity - the Entity to be dereferenced
Returns:
an Entity from this UnitOfWork
Throws:
EntityTypeNotFoundException - if no entity type could be found

remove

void remove(Object entity)
            throws LifecycleException
Remove the given Entity.

Parameters:
entity - the Entity to be removed.
Throws:
LifecycleException - if the entity could not be removed

complete

void complete()
              throws UnitOfWorkCompletionException,
                     ConcurrentEntityModificationException
Complete this UnitOfWork. This will send all the changes down to the underlying EntityStore's.

Throws:
UnitOfWorkCompletionException - if the UnitOfWork could not be completed
ConcurrentEntityModificationException - if entities have been modified by others

discard

void discard()
Discard thie UnitOfWork. Use this if a failure occurs that you cannot handle, or if the usecase was of a read-only character.


isOpen

boolean isOpen()
Check if the UnitOfWork is open. It is closed after either complete() or discard() methods have been called successfully.

Returns:
true if the UnitOfWork is open.

isPaused

boolean isPaused()
Check if the UnitOfWork is paused. It is not paused after it has been create through the UnitOfWorkFactory, and it can be paused by calling pause() and then resumed by calling resume().

Returns:
true if this UnitOfWork has been paused.

pause

void pause()
Pauses this UnitOfWork.

Calling this method will cause the underlying UnitOfWork to become the current UnitOfWork until the the resume() method is called. It is the client's responsibility not to drop the reference to this UnitOfWork while being paused.


resume

void resume()
Resumes this UnitOfWork to again become the current UnitOfWork.


addUnitOfWorkCallback

void addUnitOfWorkCallback(UnitOfWorkCallback callback)
Register a callback. Callbacks are invoked when the UnitOfWork is completed or discarded.

Parameters:
callback - a callback to be registered with this UnitOfWork

removeUnitOfWorkCallback

void removeUnitOfWorkCallback(UnitOfWorkCallback callback)