Package org.hibernate

Interface CustomEntityDirtinessStrategy

All Known Implementing Classes:
DefaultCustomEntityDirtinessStrategy

public interface CustomEntityDirtinessStrategy
During a flush cycle, Hibernate needs to determine which of the entities associated with a Session are dirty, meaning modified. Dirty entities will be UPDATEed in the database.

In some circumstances, the process of determining whether an entity is dirty can carry a significant overhead, since, by default, Hibernate must check each of the entity's attribute values one by one. Sometimes, an application already has knowledge of an entity's dirtiness and making use of that information would save some work. This contract allows the application to take over the task of determining if an entity is dirty.

For example, the application program might define an interface implemented by entities which keep track of their own modified fields:

 public interface DirtyTracker {
     Set<String> changes();
 }
 
Then the following implementation of CustomEntityDirtinessStrategy would be used:
 public class DirtyTrackerDirtinessStrategy implements CustomEntityDirtinessStrategy {
     @Override
     public boolean canDirtyCheck(Object entity, EntityPersister persister, Session session) {
         return entity instanceof DirtyTracker;
     }

     @Override
     public boolean isDirty(Object entity, EntityPersister persister, Session session) {
         return !((DirtyTracker) entity).changes().isEmpty();
     }

     @Override
     public void resetDirty(Object entity, EntityPersister persister, Session session) {
         ((DirtyTracker) entity).changes().clear();
     }

     @Override
     public void findDirty(Object entity, EntityPersister persister, Session session, DirtyCheckContext dirtyCheckContext) {
         dirtyCheckContext.doDirtyChecking( attributeInformation ->
                ((DirtyTracker) entity).changes().contains( attributeInformation.getName() ) );
     }
 }
 
See Also: