org.hibernate.engine.spi.EntityEntry Maven / Gradle / Ivy
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or .
*/
package org.hibernate.engine.spi;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import org.hibernate.LockMode;
import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.persister.entity.EntityPersister;
/**
* We need an entry to tell us all about the current state of an object with respect to its persistent state
*
* Implementation Warning: Hibernate needs to instantiate a high amount of instances of this class,
* therefore we need to take care of its impact on memory consumption.
*
* @author Gavin King
* @author Emmanuel Bernard
* @author Gunnar Morling
* @author Sanne Grinovero
*/
public interface EntityEntry {
LockMode getLockMode();
void setLockMode(LockMode lockMode);
Status getStatus();
void setStatus(Status status);
Serializable getId();
Object[] getLoadedState();
Object getLoadedValue(String propertyName);
void overwriteLoadedStateCollectionValue(String propertyName, PersistentCollection collection);
Object[] getDeletedState();
void setDeletedState(Object[] deletedState);
boolean isExistsInDatabase();
Object getVersion();
EntityPersister getPersister();
/**
* Get the EntityKey based on this EntityEntry.
* @return the EntityKey
* @throws IllegalStateException if getId() is null
*/
EntityKey getEntityKey();
String getEntityName();
boolean isBeingReplicated();
Object getRowId();
/**
* Handle updating the internal state of the entry after actually performing
* the database update. Specifically we update the snapshot information and
* escalate the lock mode
*
* @param entity The entity instance
* @param updatedState The state calculated after the update (becomes the
* new {@link #getLoadedState() loaded state}.
* @param nextVersion The new version.
*/
void postUpdate(Object entity, Object[] updatedState, Object nextVersion);
/**
* After actually deleting a row, record the fact that the instance no longer
* exists in the database
*/
void postDelete();
/**
* After actually inserting a row, record the fact that the instance exists on the
* database (needed for identity-column key generation)
*/
void postInsert(Object[] insertedState);
boolean isNullifiable(boolean earlyInsert, SharedSessionContractImplementor session);
/**
* Not sure this is the best method name, but the general idea here is to return {@code true} if the entity can
* possibly be dirty. This can only be the case if it is in a modifiable state (not read-only/deleted) and it
* either has mutable properties or field-interception is not telling us it is dirty. Clear as mud? :/
*
* A name like canPossiblyBeDirty might be better
*
* @param entity The entity to test
*
* @return {@code true} indicates that the entity could possibly be dirty and that dirty check
* should happen; {@code false} indicates there is no way the entity can be dirty
*/
boolean requiresDirtyCheck(Object entity);
/**
* Can the entity be modified?
*
* The entity is modifiable if all of the following are true:
*
* - the entity class is mutable
* - the entity is not read-only
* - if the current status is Status.DELETED, then the entity was not read-only when it was deleted
*
* @return true, if the entity is modifiable; false, otherwise,
*/
boolean isModifiableEntity();
void forceLocked(Object entity, Object nextVersion);
boolean isReadOnly();
void setReadOnly(boolean readOnly, Object entity);
@Override
String toString();
/**
* Custom serialization routine used during serialization of a
* Session/PersistenceContext for increased performance.
*
* @param oos The stream to which we should write the serial data.
*
* @throws java.io.IOException If a stream error occurs
*/
void serialize(ObjectOutputStream oos) throws IOException;
//the following methods are handling extraState contracts.
//they are not shared by a common superclass to avoid alignment padding
//we are trading off duplication for padding efficiency
void addExtraState(EntityEntryExtraState extraState);
T getExtraState(Class extraStateType);
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy