1 package org.hibernate.event.def; 3 4 import java.io.Serializable ; 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 25 public class DefaultLockEventListener extends AbstractLockUpgradeEventListener implements LockEventListener { 26 27 32 public void onLock(LockEvent event) throws HibernateException { 33 34 if ( event.getObject() == null ) { 35 throw new NullPointerException ( "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 entity = source.getPersistenceContext().unproxyAndReassociate( event.getObject() ); 45 48 EntityEntry entry = source.getPersistenceContext().getEntry(entity); 49 if (entry==null) { 50 final EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity ); 51 final Serializable 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 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 |