/** * 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(); } }
private ManagedEntity getAssociatedManagedEntity(Object entity) { if ( ManagedEntity.class.isInstance( entity ) ) { final ManagedEntity managedEntity = (ManagedEntity) entity; if ( managedEntity.$$_hibernate_getEntityEntry() == null ) { // it is not associated return null; } final AbstractEntityEntry entityEntry = (AbstractEntityEntry) managedEntity.$$_hibernate_getEntityEntry(); if ( entityEntry.getPersister().isMutable() ) { return entityEntry.getPersistenceContext() == persistenceContext ? managedEntity // it is associated : null; } else { // if managedEntity is associated with this EntityEntryContext, then // it will have an entry in immutableManagedEntityXref and its // holder will be returned. return immutableManagedEntityXref != null ? immutableManagedEntityXref.get( managedEntity ) : null; } } else { return nonEnhancedEntityXref != null ? nonEnhancedEntityXref.get( entity ) : null; } }
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(); } }
/** * 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; }
private void checkNotAssociatedWithOtherPersistenceContextIfMutable(ManagedEntity managedEntity) { // we only have to check mutable managedEntity final AbstractEntityEntry entityEntry = (AbstractEntityEntry) managedEntity.$$_hibernate_getEntityEntry(); if ( entityEntry == null || !entityEntry.getDescriptor().getJavaTypeDescriptor().getMutabilityPlan().isMutable() || entityEntry.getPersistenceContext() == null || entityEntry.getPersistenceContext() == persistenceContext ) { return; } if ( entityEntry.getPersistenceContext().getSession().isOpen() ) { // NOTE: otherPersistenceContext may be operating on the entityEntry in a different thread. // it is not safe to associate entityEntry with this EntityEntryContext. throw new HibernateException( "Illegal attempt to associate a ManagedEntity with two open persistence contexts. " + entityEntry ); } else { // otherPersistenceContext is associated with a closed PersistenceContext log.stalePersistenceContextInEntityEntry( entityEntry.toString() ); } }
/** * Retrieve the associated EntityEntry for the entity * * @param entity The entity to retrieve the EntityEntry for * * @return The associated EntityEntry */ public EntityEntry getEntityEntry(Object entity) { // locate a ManagedEntity for the entity, but only if it is associated with the same PersistenceContext. final ManagedEntity managedEntity = getAssociatedManagedEntity( entity ); // and get/return the EntityEntry from the ManagedEntry return managedEntity == null ? null : managedEntity.$$_hibernate_getEntityEntry(); }
/** * 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(); } }
private boolean canClearEntityEntryReference(){ if( managedEntity.$$_hibernate_getEntityEntry() == null ) { return true; } if( !(managedEntity.$$_hibernate_getEntityEntry() instanceof ImmutableEntityEntry) ) { return true; } else if( managedEntity.$$_hibernate_getEntityEntry().getDescriptor().canUseReferenceCacheEntries() ) { return false; } return true; } }
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(); }
@Override public EntityEntry $$_hibernate_getEntityEntry() { return managedEntity.$$_hibernate_getEntityEntry(); }
assertNotNull( managedParent.$$_hibernate_getEntityEntry() ); assertNull( managedParent.$$_hibernate_getPreviousManagedEntity() ); assertNull( managedParent.$$_hibernate_getNextManagedEntity() ); assertNull( managedParent.$$_hibernate_getEntityEntry() ); assertNull( managedParent.$$_hibernate_getPreviousManagedEntity() ); assertNull( managedParent.$$_hibernate_getNextManagedEntity() ); assertNull( managedParent.$$_hibernate_getEntityEntry() ); assertNull( managedParent.$$_hibernate_getPreviousManagedEntity() ); assertNull( managedParent.$$_hibernate_getNextManagedEntity() );
/** * 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; }
@Override public Object getIdentifier(Object entity) { if ( entity == null ) { throw new IllegalArgumentException( "Passed entity cannot be null" ); } if ( entity instanceof HibernateProxy ) { return ((HibernateProxy) entity).getHibernateLazyInitializer().getIdentifier(); } else if ( entity instanceof ManagedEntity ) { EntityEntry entityEntry = ((ManagedEntity) entity).$$_hibernate_getEntityEntry(); if ( entityEntry != null ) { return entityEntry.getId(); } else { // HHH-11426 - best effort to deal with the case of detached entities log.debug( "javax.persistence.PersistenceUnitUtil.getIdentifier may not be able to read identifier of a detached entity" ); return getIdentifierFromPersister( entity ); } } else { log.debugf( "javax.persistence.PersistenceUnitUtil.getIdentifier is only intended to work with enhanced entities " + "(although Hibernate also adapts this support to its proxies); " + "however the passed entity was not enhanced (nor a proxy).. may not be able to read identifier" ); return getIdentifierFromPersister( entity ); } }
private void checkNotAssociatedWithOtherPersistenceContextIfMutable(ManagedEntity managedEntity) { // we only have to check mutable managedEntity final AbstractEntityEntry entityEntry = (AbstractEntityEntry) managedEntity.$$_hibernate_getEntityEntry(); if ( entityEntry == null || !entityEntry.getPersister().isMutable() || entityEntry.getPersistenceContext() == null || entityEntry.getPersistenceContext() == persistenceContext ) { return; } if ( entityEntry.getPersistenceContext().getSession().isOpen() ) { // NOTE: otherPersistenceContext may be operating on the entityEntry in a different thread. // it is not safe to associate entityEntry with this EntityEntryContext. throw new HibernateException( "Illegal attempt to associate a ManagedEntity with two open persistence contexts. " + entityEntry ); } else { // otherPersistenceContext is associated with a closed PersistenceContext log.stalePersistenceContextInEntityEntry( entityEntry.toString() ); } }
/** * Retrieve the associated EntityEntry for the entity * * @param entity The entity to retrieve the EntityEntry for * * @return The associated EntityEntry */ public EntityEntry getEntityEntry(Object entity) { // locate a ManagedEntity for the entity, but only if it is associated with the same PersistenceContext. final ManagedEntity managedEntity = getAssociatedManagedEntity( entity ); // and get/return the EntityEntry from the ManagedEntry return managedEntity == null ? null : managedEntity.$$_hibernate_getEntityEntry(); }
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; } }
@Override public EntityEntry $$_hibernate_getEntityEntry() { return managedEntity.$$_hibernate_getEntityEntry(); }
/** * 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(); } }
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(); }