1 package org.hibernate.event.def; 3 4 import org.apache.commons.logging.Log; 5 import org.apache.commons.logging.LogFactory; 6 7 import org.hibernate.HibernateException; 8 import org.hibernate.LockMode; 9 import org.hibernate.ObjectDeletedException; 10 import org.hibernate.cache.CacheConcurrencyStrategy; 11 import org.hibernate.cache.CacheKey; 12 import org.hibernate.engine.EntityEntry; 13 import org.hibernate.engine.Status; 14 import org.hibernate.engine.SessionImplementor; 15 import org.hibernate.persister.entity.EntityPersister; 16 import org.hibernate.pretty.MessageHelper; 17 18 24 public class AbstractLockUpgradeEventListener extends AbstractReassociateEventListener { 25 26 private static final Log log = LogFactory.getLog(AbstractLockUpgradeEventListener.class); 27 28 37 protected void upgradeLock(Object object, EntityEntry entry, LockMode requestedLockMode, SessionImplementor source) 38 throws HibernateException { 39 40 if ( requestedLockMode.greaterThan( entry.getLockMode() ) ) { 41 42 if ( entry.getStatus() != Status.MANAGED ) { 43 throw new ObjectDeletedException( 44 "attempted to lock a deleted instance", 45 entry.getId(), 46 entry.getPersister().getEntityName() 47 ); 48 } 49 50 final EntityPersister persister = entry.getPersister(); 51 52 if ( log.isTraceEnabled() ) 53 log.trace( 54 "locking " + 55 MessageHelper.infoString( persister, entry.getId(), source.getFactory() ) + 56 " in mode: " + 57 requestedLockMode 58 ); 59 60 final CacheConcurrencyStrategy.SoftLock lock; 61 final CacheKey ck; 62 if ( persister.hasCache() ) { 63 ck = new CacheKey( 64 entry.getId(), 65 persister.getIdentifierType(), 66 persister.getRootEntityName(), 67 source.getEntityMode(), 68 source.getFactory() 69 ); 70 lock = persister.getCache().lock( ck, entry.getVersion() ); 71 } 72 else { 73 ck = null; 74 lock = null; 75 } 76 77 try { 78 persister.lock( entry.getId(), entry.getVersion(), object, requestedLockMode, source ); 79 entry.setLockMode(requestedLockMode); 80 } 81 finally { 82 if ( persister.hasCache() ) { 85 persister.getCache().release(ck, lock ); 86 } 87 } 88 89 } 90 } 91 92 } 93 | Popular Tags |