KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > hibernate > event > def > DefaultLockEventListener


1 //$Id: DefaultLockEventListener.java,v 1.6 2005/06/05 05:09:57 oneovthafew Exp $
2
package org.hibernate.event.def;
3
4 import java.io.Serializable JavaDoc;
5
6 import org.hibernate.HibernateException;
7 import org.hibernate.LockMode;
8 import org.hibernate.TransientObjectException;
9 import org.hibernate.engine.Cascade;
10 import org.hibernate.engine.CascadingAction;
11 import org.hibernate.engine.EntityEntry;
12 import org.hibernate.engine.ForeignKeys;
13 import org.hibernate.event.EventSource;
14 import org.hibernate.event.LockEvent;
15 import org.hibernate.event.LockEventListener;
16 import org.hibernate.engine.SessionImplementor;
17 import org.hibernate.persister.entity.EntityPersister;
18
19 /**
20  * Defines the default lock event listeners used by hibernate to lock entities
21  * in response to generated lock events.
22  *
23  * @author Steve Ebersole
24  */

25 public class DefaultLockEventListener extends AbstractLockUpgradeEventListener implements LockEventListener {
26
27     /** Handle the given lock event.
28      *
29      * @param event The lock event to be handled.
30      * @throws HibernateException
31      */

32     public void onLock(LockEvent event) throws HibernateException {
33
34         if ( event.getObject() == null ) {
35             throw new NullPointerException JavaDoc( "attempted to lock null" );
36         }
37
38         if ( event.getLockMode() == LockMode.WRITE ) {
39             throw new HibernateException( "Invalid lock mode for lock()" );
40         }
41
42         SessionImplementor source = event.getSession();
43         
44         Object JavaDoc entity = source.getPersistenceContext().unproxyAndReassociate( event.getObject() );
45         //TODO: if object was an uninitialized proxy, this is inefficient,
46
// resulting in two SQL selects
47

48         EntityEntry entry = source.getPersistenceContext().getEntry(entity);
49         if (entry==null) {
50             final EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );
51             final Serializable JavaDoc id = persister.getIdentifier( entity, source.getEntityMode() );
52             if ( !ForeignKeys.isNotTransient( event.getEntityName(), entity, Boolean.FALSE, source ) ) {
53                 throw new TransientObjectException(
54                         "cannot lock an unsaved transient instance: " +
55                         persister.getEntityName()
56                 );
57             }
58
59             entry = reassociate(event, entity, id, persister);
60             
61             cascadeOnLock(event, persister, entity);
62         }
63
64         upgradeLock( entity, entry, event.getLockMode(), source );
65     }
66     
67     private void cascadeOnLock(LockEvent event, EntityPersister persister, Object JavaDoc entity) {
68         EventSource source = event.getSession();
69         source.getPersistenceContext().incrementCascadeLevel();
70         try {
71             new Cascade(CascadingAction.LOCK, Cascade.AFTER_LOCK, source)
72                     .cascade( persister, entity, event.getLockMode() );
73         }
74         finally {
75             source.getPersistenceContext().decrementCascadeLevel();
76         }
77     }
78
79 }
80
Popular Tags