Example usage for org.hibernate.engine.spi CollectionEntry getLoadedPersister

List of usage examples for org.hibernate.engine.spi CollectionEntry getLoadedPersister

Introduction

In this page you can find the example usage for org.hibernate.engine.spi CollectionEntry getLoadedPersister.

Prototype

public CollectionPersister getLoadedPersister() 

Source Link

Document

This is only available late during the flush cycle

Usage

From source file:br.gov.jfrj.siga.model.Objeto.java

License:Open Source License

private static void cascadeOrphans(Objeto base, PersistentCollection persistentCollection, boolean willBeSaved)
        throws UnexpectedException {
    SessionImpl session = ((SessionImpl) em().getDelegate());
    PersistenceContext pc = session.getPersistenceContext();
    CollectionEntry ce = pc.getCollectionEntry(persistentCollection);

    if (ce != null) {
        CollectionPersister cp = ce.getLoadedPersister();
        if (cp != null) {
            Type ct = cp.getElementType();
            if (ct instanceof EntityType) {
                EntityEntry entry = pc.getEntry(base);
                String entityName = entry.getEntityName();
                entityName = ((EntityType) ct).getAssociatedEntityName(session.getFactory());
                if (ce.getSnapshot() != null) {
                    Collection orphans = ce.getOrphans(entityName, persistentCollection);
                    for (Object o : orphans) {
                        saveAndCascadeIfObjeto(o, willBeSaved);
                    }/*from  ww  w .j  a v a2  s. c  om*/
                }
            }
        }
    }
}

From source file:com.amalto.core.storage.hibernate.TypeMapping.java

License:Open Source License

@SuppressWarnings({ "rawtypes", "unchecked" })
protected static <T> List<T> getFullList(List valueList) {
    if (valueList == null) {
        return null;
    }//from www  . j a v  a  2s  .c o  m
    if (!(valueList instanceof PersistentList)) {
        return valueList;
    }
    PersistentList list = (PersistentList) valueList;
    List<T> fullList = new LinkedList<T>();
    SessionImplementor session = list.getSession();
    if (!session.isConnected()) {
        throw new IllegalStateException("Session is not connected: impossible to read values from database."); //$NON-NLS-1$
    }
    CollectionEntry entry = session.getPersistenceContext().getCollectionEntry(list);
    CollectionPersister persister = entry.getLoadedPersister();
    if (persister != null) {
        int databaseSize = persister.getSize(entry.getKey(), session);
        if (list.size() == databaseSize && !list.contains(null)) {
            // No need to reload a list (no omission in list and size() corresponds to size read from database).
            return list;
        }
        for (int i = 0; i < databaseSize; i++) {
            T wrapper = (T) persister.getElementByIndex(entry.getLoadedKey(), i, session, list.getOwner());
            fullList.add(wrapper);
        }
    }
    // Returns a unmodifiable list -> returned list is *not* a persistent list so change tracking is not possible,
    // returning a unmodifiable list is a safety for code using returned list.
    return Collections.unmodifiableList(fullList);
}

From source file:org.babyfish.hibernate.collection.spi.persistence.AbstractBasePersistence.java

License:Open Source License

@Override
public final boolean setCurrentSession(SessionImplementor session) throws HibernateException {
    if (session == this.getSession()) {
        return false;
    } else {//from  w  w  w  .  ja  v a 2 s.c  om
        if (this.isConnectedToSession()) {
            CollectionEntry ce = session.getPersistenceContext()
                    .getCollectionEntry(this.getWrapperPersistentCollection());
            if (ce == null) {
                throw new HibernateException(
                        "Illegal attempt to associate a collection with two open sessions");
            } else {
                throw new HibernateException(
                        "Illegal attempt to associate a collection with two open sessions: "
                                + MessageHelper.collectionInfoString(ce.getLoadedPersister(), ce.getLoadedKey(),
                                        session.getFactory()));
            }
        } else {
            this.setSession(session);
            return true;
        }
    }
}

From source file:org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.WrappedHibernateList.java

License:Open Source License

public int size() {
    if (cachedSize != -1) {
        return cachedSize;
    }/*from   ww  w  . j a va 2s  .c  om*/
    if (getDelegate() instanceof AbstractPersistentCollection) {
        final AbstractPersistentCollection collection = (AbstractPersistentCollection) getDelegate();
        if (collection.wasInitialized()) {
            cachedSize = -1;
            return getDelegate().size();
        }
        final SessionImplementor session = collection.getSession();
        CollectionEntry entry = session.getPersistenceContext().getCollectionEntry(collection);
        CollectionPersister persister = entry.getLoadedPersister();
        if (collection.hasQueuedOperations()) {
            session.flush();
        }
        cachedSize = persister.getSize(entry.getLoadedKey(), session);
        return cachedSize;
    }

    return getDelegate().size();
}

From source file:org.granite.tide.hibernate4.HibernateDataChangePublishListener.java

License:Open Source License

@SuppressWarnings("unchecked")
public void onPreUpdateCollection(PreCollectionUpdateEvent event) {
    Object owner = event.getAffectedOwnerOrNull();
    if (DataPublishListener.handleExclude(owner))
        return;//from www . j  a v a2  s  .  c  o  m

    CollectionEntry collectionEntry = event.getSession().getPersistenceContext()
            .getCollectionEntry(event.getCollection());

    String propertyName = collectionEntry.getRole().substring(
            collectionEntry.getLoadedPersister().getOwnerEntityPersister().getEntityName().length() + 1);

    Object change = getChange(collectionEntry.getLoadedPersister().getOwnerEntityPersister(),
            event.getSession(), event.getAffectedOwnerEntityName(), event.getAffectedOwnerIdOrNull(), owner);
    if (change == null || !(change instanceof Change))
        return;

    PersistentCollection newColl = event.getCollection();
    Serializable oldColl = collectionEntry.getSnapshot();

    if (oldColl == null && newColl.hasQueuedOperations()) {
        List<Object[]> added = new ArrayList<Object[]>();
        List<Object[]> removed = new ArrayList<Object[]>();
        List<Object[]> updated = new ArrayList<Object[]>();

        List<?> queuedOperations = get(newColl, "operationQueue", List.class);
        for (Object op : queuedOperations) {
            // Great !!
            if (op.getClass().getName().endsWith("$Add")) {
                added.add(new Object[] { get(op, "index"), get(op, "value") });
            } else if (op.getClass().getName().endsWith("$SimpleAdd")) {
                added.add(new Object[] { null, get(op, "value") });
            } else if (op.getClass().getName().endsWith("$Put")) {
                added.add(new Object[] { get(op, "index"), get(op, "value") });
            } else if (op.getClass().getName().endsWith("$Remove")) {
                removed.add(new Object[] { get(op, "index"), get(op, "old") });
            } else if (op.getClass().getName().endsWith("$SimpleRemove")) {
                removed.add(new Object[] { null, get(op, "value") });
            } else if (op.getClass().getName().endsWith("$Set")) {
                updated.add(new Object[] { get(op, "index"), get(op, "value") });
            }
        }

        CollectionChange[] collChanges = new CollectionChange[added.size() + removed.size() + updated.size()];
        int idx = 0;
        for (Object[] obj : added)
            collChanges[idx++] = new CollectionChange(1, obj[0], obj[1]);

        for (Object[] obj : removed) {
            Object value = obj[1];
            if (value != null && value.getClass().isAnnotationPresent(Entity.class)) {
                org.granite.util.Entity e = new org.granite.util.Entity(value);
                value = new ChangeRef(e.getName(), (String) get(value, "uid"),
                        (Serializable) e.getIdentifier());
            }
            collChanges[idx++] = new CollectionChange(-1, obj[0], value);
        }

        for (Object[] obj : updated)
            collChanges[idx++] = new CollectionChange(0, obj[0], obj[1]);

        ((Change) change).addCollectionChanges(propertyName, collChanges);
    } else if (oldColl != null && newColl instanceof List<?>) {
        List<?> oldSnapshot = (List<?>) oldColl;
        List<?> newList = (List<?>) newColl;

        List<Object[]> ops = Utils.diffLists(oldSnapshot, newList);

        CollectionChange[] collChanges = new CollectionChange[ops.size()];
        int idx = 0;
        for (Object[] obj : ops)
            collChanges[idx++] = new CollectionChange((Integer) obj[0], obj[1], obj[2]);

        ((Change) change).addCollectionChanges(propertyName, collChanges);
    } else if (oldColl != null && newColl instanceof Collection<?>) {
        Map<?, ?> oldSnapshot = (Map<?, ?>) oldColl;

        Set<Object> added = new HashSet<Object>();
        added.addAll((Collection<?>) newColl);
        added.removeAll(new HashSet<Object>(oldSnapshot.keySet()));

        Set<Object> removed = new HashSet<Object>();
        removed.addAll(new HashSet<Object>(oldSnapshot.keySet()));
        removed.removeAll((Collection<?>) newColl);

        CollectionChange[] collChanges = new CollectionChange[added.size() + removed.size()];
        int idx = 0;
        for (Object obj : added)
            collChanges[idx++] = new CollectionChange(1, null, obj);

        for (Object obj : removed)
            collChanges[idx++] = new CollectionChange(-1, null, obj);

        ((Change) change).addCollectionChanges(propertyName, collChanges);
    } else if (oldColl != null && newColl instanceof Map<?, ?>) {
        Map<?, ?> oldSnapshot = (Map<?, ?>) oldColl;

        Set<Entry<Object, Object>> added = new HashSet<Entry<Object, Object>>();
        added.addAll(((Map<Object, Object>) newColl).entrySet());
        added.removeAll(new HashMap<Object, Object>(oldSnapshot).entrySet());

        Set<Entry<Object, Object>> removed = new HashSet<Entry<Object, Object>>();
        removed.addAll(new HashMap<Object, Object>(oldSnapshot).entrySet());
        removed.removeAll(((Map<Object, Object>) newColl).entrySet());

        CollectionChange[] collChanges = new CollectionChange[added.size() + removed.size()];
        int idx = 0;
        for (Entry<?, ?> me : added)
            collChanges[idx++] = new CollectionChange(1, me.getKey(), me.getValue());

        for (Entry<?, ?> me : removed)
            collChanges[idx++] = new CollectionChange(-1, me.getKey(), me.getValue());

        ((Change) change).addCollectionChanges(propertyName, collChanges);
    }
}