/** * 1. detect any dirty entities 2. schedule any entity updates 3. search out any reachable * collections */ private int flushEntities(final FlushEvent event, final PersistenceContext persistenceContext) throws HibernateException { LOG.trace("Flushing entities and processing referenced collections"); final EventSource source = event.getSession(); final Iterable<FlushEntityEventListener> flushListeners = source .getFactory() .getServiceRegistry() .getService(EventListenerRegistry.class) .getEventListenerGroup(EventType.FLUSH_ENTITY) .listeners(); // Among other things, updateReachables() will recursively load all // collections that are moving roles. This might cause entities to // be loaded. // So this needs to be safe from concurrent modification problems. final Map.Entry<Object, EntityEntry>[] entityEntries = persistenceContext.reentrantSafeEntityEntries(); final int count = entityEntries.length; for (Map.Entry<Object, EntityEntry> me : entityEntries) { // Update the status of the object and if necessary, schedule an update EntityEntry entry = me.getValue(); Status status = entry.getStatus(); if (status != Status.LOADING && status != Status.GONE) { final FlushEntityEvent entityEvent = new FlushEntityEvent(source, me.getKey(), entry); for (FlushEntityEventListener listener : flushListeners) { listener.onFlushEntity(entityEvent); } } } source.getActionQueue().sortActions(); return count; }
/** * 1. detect any dirty entities 2. schedule any entity updates 3. search out any reachable * collections */ private void flushEntities(FlushEvent event) throws HibernateException { LOG.trace("Flushing entities and processing referenced collections"); // Among other things, updateReachables() will recursively load all // collections that are moving roles. This might cause entities to // be loaded. // So this needs to be safe from concurrent modification problems. // It is safe because of how IdentityMap implements entrySet() final EventSource source = event.getSession(); final Map.Entry[] list = IdentityMap.concurrentEntries(source.getPersistenceContext().getEntityEntries()); final int size = list.length; for (int i = 0; i < size; i++) { // Update the status of the object and if necessary, schedule an update Map.Entry me = list[i]; EntityEntry entry = (EntityEntry) me.getValue(); Status status = entry.getStatus(); if (status != Status.LOADING && status != Status.GONE) { final FlushEntityEvent entityEvent = new FlushEntityEvent(source, me.getKey(), entry); final EventListenerGroup<FlushEntityEventListener> listenerGroup = source .getFactory() .getServiceRegistry() .getService(EventListenerRegistry.class) .getEventListenerGroup(EventType.FLUSH_ENTITY); for (FlushEntityEventListener listener : listenerGroup.listeners()) { listener.onFlushEntity(entityEvent); } } } source.getActionQueue().sortActions(); }