final ManagedEntity previous = managedEntity.$$_hibernate_getPreviousManagedEntity(); final ManagedEntity next = managedEntity.$$_hibernate_getNextManagedEntity(); managedEntity.$$_hibernate_setPreviousManagedEntity( null ); managedEntity.$$_hibernate_setNextManagedEntity( null ); previous.$$_hibernate_setNextManagedEntity( next ); next.$$_hibernate_setPreviousManagedEntity( previous ); final EntityEntry theEntityEntry = managedEntity.$$_hibernate_getEntityEntry(); managedEntity.$$_hibernate_setEntityEntry( null ); return theEntityEntry;
/** * The main bugaboo with IdentityMap that warranted this class in the first place. * * Return an array of all the entity/EntityEntry pairs in this context. The array is to make sure * that the iterators built off of it are safe from concurrency/reentrancy * * @return The safe array */ public Map.Entry<Object, EntityEntry>[] reentrantSafeEntityEntries() { if ( dirty ) { reentrantSafeEntries = new EntityEntryCrossRefImpl[count]; int i = 0; ManagedEntity managedEntity = head; while ( managedEntity != null ) { reentrantSafeEntries[i++] = new EntityEntryCrossRefImpl( managedEntity.$$_hibernate_getEntityInstance(), managedEntity.$$_hibernate_getEntityEntry() ); managedEntity = managedEntity.$$_hibernate_getNextManagedEntity(); } dirty = false; } return reentrantSafeEntries; }
/** * Down-grade locks to NONE for all entities in this context */ public void downgradeLocks() { if ( head == null ) { return; } ManagedEntity node = head; while ( node != null ) { node.$$_hibernate_getEntityEntry().setLockMode( LockMode.NONE ); node = node.$$_hibernate_getNextManagedEntity(); } }
/** * Clear this context of all managed entities */ public void clear() { dirty = true; ManagedEntity node = head; while ( node != null ) { final ManagedEntity nextNode = node.$$_hibernate_getNextManagedEntity(); node.$$_hibernate_setEntityEntry( null ); node.$$_hibernate_setPreviousManagedEntity( null ); node.$$_hibernate_setNextManagedEntity( null ); node = nextNode; } if ( immutableManagedEntityXref != null ) { immutableManagedEntityXref.clear(); } if ( nonEnhancedEntityXref != null ) { nonEnhancedEntityXref.clear(); } head = null; tail = null; count = 0; reentrantSafeEntries = null; }
assertNotNull( managedParent.$$_hibernate_getEntityInstance() ); assertNotNull( managedParent.$$_hibernate_getEntityEntry() ); assertNull( managedParent.$$_hibernate_getPreviousManagedEntity() ); assertNull( managedParent.$$_hibernate_getNextManagedEntity() ); assertNotNull( managedParent.$$_hibernate_getEntityInstance() ); assertNull( managedParent.$$_hibernate_getEntityEntry() ); assertNull( managedParent.$$_hibernate_getPreviousManagedEntity() ); assertNull( managedParent.$$_hibernate_getNextManagedEntity() ); assertNotNull( managedParent.$$_hibernate_getEntityInstance() ); assertNull( managedParent.$$_hibernate_getEntityEntry() ); assertNull( managedParent.$$_hibernate_getPreviousManagedEntity() ); assertNull( managedParent.$$_hibernate_getNextManagedEntity() );
managedEntity.$$_hibernate_setEntityEntry( entityEntry ); assert head == null; managedEntity.$$_hibernate_setPreviousManagedEntity( null ); managedEntity.$$_hibernate_setNextManagedEntity( null ); head = managedEntity; tail = head; tail.$$_hibernate_setNextManagedEntity( managedEntity ); managedEntity.$$_hibernate_setPreviousManagedEntity( tail ); managedEntity.$$_hibernate_setNextManagedEntity( null ); tail = managedEntity; count++;
@Override public EntityEntry $$_hibernate_getEntityEntry() { return managedEntity.$$_hibernate_getEntityEntry(); }
@Override public Object $$_hibernate_getEntityInstance() { return managedEntity.$$_hibernate_getEntityInstance(); }
@Override public void $$_hibernate_setEntityEntry(EntityEntry entityEntry) { // need to think about implications for memory leaks here if we don't removed reference to EntityEntry if ( entityEntry == null ) { if ( canClearEntityEntryReference() ) { managedEntity.$$_hibernate_setEntityEntry( null ); } // otherwise, do nothing. } else { // TODO: we may want to do something different here if // managedEntity is in the process of being deleted. // An immutable ManagedEntity can be associated with // multiple PersistenceContexts. Changing the status // to DELETED probably should not happen directly // in the ManagedEntity because that would affect all // PersistenceContexts to which the ManagedEntity is // associated. managedEntity.$$_hibernate_setEntityEntry( entityEntry ); } }
/** * Clear this context of all managed entities */ public void clear() { dirty = true; ManagedEntity node = head; while ( node != null ) { final ManagedEntity nextNode = node.$$_hibernate_getNextManagedEntity(); node.$$_hibernate_setEntityEntry( null ); node.$$_hibernate_setPreviousManagedEntity( null ); node.$$_hibernate_setNextManagedEntity( null ); node = nextNode; } if ( immutableManagedEntityXref != null ) { immutableManagedEntityXref.clear(); } if ( nonEnhancedEntityXref != null ) { nonEnhancedEntityXref.clear(); } head = null; tail = null; count = 0; reentrantSafeEntries = null; }
managedEntity.$$_hibernate_setEntityEntry( entry ); previous.$$_hibernate_setNextManagedEntity( managedEntity ); managedEntity.$$_hibernate_setPreviousManagedEntity( previous );
private boolean canClearEntityEntryReference(){ if( managedEntity.$$_hibernate_getEntityEntry() == null ) { return true; } if( !(managedEntity.$$_hibernate_getEntityEntry() instanceof ImmutableEntityEntry) ) { return true; } else if( managedEntity.$$_hibernate_getEntityEntry().getPersister().canUseReferenceCacheEntries() ) { return false; } return true; } }
/** * Down-grade locks to NONE for all entities in this context */ public void downgradeLocks() { if ( head == null ) { return; } ManagedEntity node = head; while ( node != null ) { node.$$_hibernate_getEntityEntry().setLockMode( LockMode.NONE ); node = node.$$_hibernate_getNextManagedEntity(); } }
@Override public Object $$_hibernate_getEntityInstance() { return managedEntity.$$_hibernate_getEntityInstance(); }
@Override public void $$_hibernate_setEntityEntry(EntityEntry entityEntry) { // need to think about implications for memory leaks here if we don't removed reference to EntityEntry if ( entityEntry == null ) { if ( canClearEntityEntryReference() ) { managedEntity.$$_hibernate_setEntityEntry( null ); } // otherwise, do nothing. } else { // TODO: we may want to do something different here if // managedEntity is in the process of being deleted. // An immutable ManagedEntity can be associated with // multiple PersistenceContexts. Changing the status // to DELETED probably should not happen directly // in the ManagedEntity because that would affect all // PersistenceContexts to which the ManagedEntity is // associated. managedEntity.$$_hibernate_setEntityEntry( entityEntry ); } }
final ManagedEntity previous = managedEntity.$$_hibernate_getPreviousManagedEntity(); final ManagedEntity next = managedEntity.$$_hibernate_getNextManagedEntity(); managedEntity.$$_hibernate_setPreviousManagedEntity( null ); managedEntity.$$_hibernate_setNextManagedEntity( null ); previous.$$_hibernate_setNextManagedEntity( next ); next.$$_hibernate_setPreviousManagedEntity( previous ); final EntityEntry theEntityEntry = managedEntity.$$_hibernate_getEntityEntry(); managedEntity.$$_hibernate_setEntityEntry( null ); return theEntityEntry;
/** * JDK serialization hook for serializing * * @param oos The stream to write ourselves to * * @throws IOException Indicates an IO exception accessing the given stream */ public void serialize(ObjectOutputStream oos) throws IOException { log.tracef( "Starting serialization of [%s] EntityEntry entries", count ); oos.writeInt( count ); if ( count == 0 ) { return; } ManagedEntity managedEntity = head; while ( managedEntity != null ) { // so we know whether or not to build a ManagedEntityImpl on deserialize oos.writeBoolean( managedEntity == managedEntity.$$_hibernate_getEntityInstance() ); oos.writeObject( managedEntity.$$_hibernate_getEntityInstance() ); // we need to know which implementation of EntityEntry is being serialized oos.writeInt( managedEntity.$$_hibernate_getEntityEntry().getClass().getName().length() ); oos.writeChars( managedEntity.$$_hibernate_getEntityEntry().getClass().getName() ); managedEntity.$$_hibernate_getEntityEntry().serialize( oos ); managedEntity = managedEntity.$$_hibernate_getNextManagedEntity(); } }
managedEntity.$$_hibernate_setEntityEntry( entityEntry ); assert head == null; managedEntity.$$_hibernate_setPreviousManagedEntity( null ); managedEntity.$$_hibernate_setNextManagedEntity( null ); head = managedEntity; tail = head; tail.$$_hibernate_setNextManagedEntity( managedEntity ); managedEntity.$$_hibernate_setPreviousManagedEntity( tail ); managedEntity.$$_hibernate_setNextManagedEntity( null ); tail = managedEntity; count++;
public EntityEntry addReferenceEntry( final Object entity, final Status status) { ((ManagedEntity)entity).$$_hibernate_getEntityEntry().setStatus( status ); entityEntryContext.addEntityEntry( entity, ((ManagedEntity)entity).$$_hibernate_getEntityEntry() ); setHasNonReadOnlyEnties( status ); return ((ManagedEntity)entity).$$_hibernate_getEntityEntry(); }
/** * The main bugaboo with IdentityMap that warranted this class in the first place. * * Return an array of all the entity/EntityEntry pairs in this context. The array is to make sure * that the iterators built off of it are safe from concurrency/reentrancy * * @return The safe array */ public Map.Entry<Object, EntityEntry>[] reentrantSafeEntityEntries() { if ( dirty ) { reentrantSafeEntries = new EntityEntryCrossRefImpl[count]; int i = 0; ManagedEntity managedEntity = head; while ( managedEntity != null ) { reentrantSafeEntries[i++] = new EntityEntryCrossRefImpl( managedEntity.$$_hibernate_getEntityInstance(), managedEntity.$$_hibernate_getEntityEntry() ); managedEntity = managedEntity.$$_hibernate_getNextManagedEntity(); } dirty = false; } return reentrantSafeEntries; }