@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(), getPersister() ); } return cachedEntityKey; }
@Override public boolean isModifiableEntity() { final Status status = getStatus(); final Status previousStatus = getPreviousStatus(); return getPersister().isMutable() && status != Status.READ_ONLY && ! ( status == Status.DELETED && previousStatus == Status.READ_ONLY ); }
@Override public String toString() { return "EntityEntry" + MessageHelper.infoString( getPersister().getEntityName(), id ) + '(' + getStatus() + ')'; }
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; } }
@Override public void postUpdate(Object entity, Object[] updatedState, Object nextVersion) { this.loadedState = updatedState; setLockMode( LockMode.WRITE ); if ( getPersister().isVersioned() ) { this.version = nextVersion; getPersister().setPropertyValue( entity, getPersister().getVersionProperty(), nextVersion ); } if( entity instanceof SelfDirtinessTracker ) { ( (SelfDirtinessTracker) entity ).$$_hibernate_clearDirtyAttributes(); } getPersistenceContext().getSession() .getFactory() .getCustomEntityDirtinessStrategy() .resetDirty( entity, getPersister(), (Session) getPersistenceContext().getSession() ); }
@Override public void forceLocked(Object entity, Object nextVersion) { version = nextVersion; loadedState[ persister.getVersionProperty() ] = version; // TODO: use LockMode.PESSIMISTIC_FORCE_INCREMENT //noinspection deprecation setLockMode( LockMode.FORCE ); persister.setPropertyValue( entity, getPersister().getVersionProperty(), nextVersion ); }
@SuppressWarnings( {"SimplifiableIfStatement"}) private boolean isUnequivocallyNonDirty(Object entity) { if ( entity instanceof SelfDirtinessTracker ) { return ! persister.hasCollections() && ! ( (SelfDirtinessTracker) entity ).$$_hibernate_hasDirtyAttributes(); } final CustomEntityDirtinessStrategy customEntityDirtinessStrategy = getPersistenceContext().getSession().getFactory().getCustomEntityDirtinessStrategy(); if ( customEntityDirtinessStrategy.canDirtyCheck( entity, getPersister(), (Session) getPersistenceContext().getSession() ) ) { return ! customEntityDirtinessStrategy.isDirty( entity, getPersister(), (Session) getPersistenceContext().getSession() ); } if ( getPersister().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 ( ! persister.isMutable() ) { throw new IllegalStateException( "Cannot make an immutable entity modifiable." ); } setStatus( Status.MANAGED ); loadedState = getPersister().getPropertyValues( entity ); getPersistenceContext().getNaturalIdHelper().manageLocalNaturalIdCrossReference( persister, id, loadedState, null, CachedNaturalIdValueSource.LOAD ); } }
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() ); } }