Entity Listeners are designed to react to lifecycle events of entity instances on Middleware.
A listener is a class implementing one or several interfaces of com.haulmont.cuba.core.listener
package. The listener will react to events corresponding to the implemented interfaces.
-
BeforeDetachEntityListener
-
onBeforeDetach()
method is called before the object is detached from EntityManager on transaction commit.This listener can be used for filling non-persistent entity attributes before sending it to the client tier.
-
BeforeAttachEntityListener
-
onBeforeAttach()
method is called before the object is attached to the persistent context as a result ofEntityManager.merge()
operation.This listener can be used, for example, to fill persistent entity attributes before saving it in the database.
-
BeforeInsertEntityListener
-
onBeforeInsert()
method is called before a record is inserted into database. All kinds of operations can be performed with the current EntityManager available within this method. -
AfterInsertEntityListener
-
onAfterInsert()
is called after a record is inserted into database, but before transaction commit. This method does not allow modifications of the current persistent context, however, database modifications can be done using QueryRunner. -
BeforeUpdateEntityListener
-
onBeforeUpdate()
method is called before a record is updated in the database. All kinds of operations can be performed with the current EntityManager available within this method. -
AfterUpdateEntityListener
-
onAfterUpdate()
method is called after a record was updated in the database, but before transaction commit. This method does not allow modifications of the current persistent context, however, database modifications can be done using QueryRunner. -
BeforeDeleteEntityListener
-
onBeforeDelete()
method is called before a record is deleted from the database (in the case of soft deletion – before updating a record). All kinds of operations can be performed with the current EntityManager available within this method. -
AfterDeleteEntityListener
-
onAfterDelete()
method is called after a record is deleted from the database (in the case of soft deletion – before updating a record), but before transaction commit. This method does not allow modifications of the current persistent context, however, database modifications can be done using QueryRunner.
An entity listener can be a plain Java class or a managed bean. In the latter case, injection can be used as follows:
@ManagedBean("cuba_MyEntityListener") public class MyEntityListener implements BeforeInsertEntityListener<MyEntity>, BeforeUpdateEntityListener<MyEntity> { @Inject protected Persistence persistence; @Override public void onBeforeInsert(MyEntity entity) { EntityManager em = persistence.getEntityManager(); ... } @Override public void onBeforeUpdate(MyEntity entity) { EntityManager em = persistence.getEntityManager(); ... } }
Entity Listener can be created in two ways:
-
Statically – the names of listener classes are listed in @Listeners annotation in the entity class.
-
Dynamically – entity and listener classes are passed to
addListener()
method ofEntityListenerManager
bean. For example:@ManagedBean public class MyBean implements AppContext.Listener { @Inject private EntityListenerManager entityListenerManager; public ClusterManager() { AppContext.addListener(this); } @Override public void applicationStarted() { entityListenerManager.addListener(User.class, MyUserListener.class); } @Override public void applicationStopped() { } }
Only one listener instance of a certain type is created for all instances of a particular entity class, therefore listener must not have a state.
If several listeners of the same type (for example from annotations of entity class and its parents and also added dynamically) were declared for an entity, they will be called in the following order:
-
For each ancestor, starting from the most distant one, dynamically added listeners are called first, followed by statically assigned listeners.
-
Once parent classes are processed, dynamically added listeners for given class are called first, followed by statically assigned.