@Override public EntityKey getEntityKey() { if ( cachedEntityKey == null ) { if ( getId() == null ) { throw new IllegalStateException( "cannot generate an EntityKey when id is null."); } cachedEntityKey = new EntityKey( getId(), getDescriptor() ); } return cachedEntityKey; }
@Override public String toString() { return "EntityEntry" + MessageHelper.infoString( getDescriptor().getEntityName(), id ) + '(' + getStatus() + ')'; }
@Override public boolean isModifiableEntity() { final Status status = getStatus(); final Status previousStatus = getPreviousStatus(); return getDescriptor().getHierarchy().getMutabilityPlan().isMutable() && status != Status.READ_ONLY && ! ( status == Status.DELETED && previousStatus == Status.READ_ONLY ); }
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.getDescriptor().getJavaTypeDescriptor().getMutabilityPlan().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; } }
@Override public void postUpdate(Object entity, Object[] updatedState, Object nextVersion) { this.loadedState = updatedState; setLockMode( LockMode.WRITE ); if ( getDescriptor().getHierarchy().getVersionDescriptor() != null ) { this.version = nextVersion; getDescriptor().getHierarchy().getVersionDescriptor() .getPropertyAccess() .getSetter() .set( entity, nextVersion, getDescriptor().getFactory() ); } if( entity instanceof SelfDirtinessTracker ) { ( (SelfDirtinessTracker) entity ).$$_hibernate_clearDirtyAttributes(); } getPersistenceContext().getSession() .getFactory() .getCustomEntityDirtinessStrategy() .resetDirty( entity, getDescriptor(), (Session) getPersistenceContext().getSession() ); }
/** * Check to see if we know (100%, with absolute certainty) that the entity * is not dirty (and can skip dirty checking) */ @SuppressWarnings( {"SimplifiableIfStatement"}) private boolean isUnequivocallyNonDirty(Object entity) { if ( entity instanceof SelfDirtinessTracker ) { return ! descriptor.hasCollections() && ! ( (SelfDirtinessTracker) entity ).$$_hibernate_hasDirtyAttributes(); } final CustomEntityDirtinessStrategy customEntityDirtinessStrategy = getPersistenceContext().getSession().getFactory().getCustomEntityDirtinessStrategy(); if ( customEntityDirtinessStrategy.canDirtyCheck( entity, getDescriptor(), (Session) getPersistenceContext().getSession() ) ) { return ! customEntityDirtinessStrategy.isDirty( entity, getDescriptor(), (Session) getPersistenceContext().getSession() ); } if ( getDescriptor().hasMutableProperties() ) { return false; } return false; }
@Override public void setReadOnly(boolean readOnly, Object entity) { if ( readOnly == isReadOnly() ) { // simply return since the status is not being changed return; } if ( readOnly ) { setStatus( Status.READ_ONLY ); loadedState = null; } else { if ( ! descriptor.getJavaTypeDescriptor().getMutabilityPlan().isMutable() ) { throw new IllegalStateException( "Cannot make an immutable entity modifiable." ); } setStatus( Status.MANAGED ); loadedState = getDescriptor().getPropertyValues( entity ); getPersistenceContext().getNaturalIdHelper().manageLocalNaturalIdCrossReference( descriptor, id, loadedState, null, CachedNaturalIdValueSource.LOAD ); } }
@Override public void forceLocked(Object entity, Object nextVersion) { version = nextVersion; final int versionIndex = descriptor.getHierarchy().getVersionDescriptor().getStateArrayPosition(); loadedState[ versionIndex ] = version; // TODO: use LockMode.PESSIMISTIC_FORCE_INCREMENT //noinspection deprecation setLockMode( LockMode.FORCE ); descriptor.getHierarchy().getVersionDescriptor() .getPropertyAccess() .getSetter() .set( entity, nextVersion, getDescriptor().getFactory() ); }
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() ); } }