Example usage for org.hibernate.persister.entity EntityPersister hasCollections

List of usage examples for org.hibernate.persister.entity EntityPersister hasCollections

Introduction

In this page you can find the example usage for org.hibernate.persister.entity EntityPersister hasCollections.

Prototype

boolean hasCollections();

Source Link

Document

Determine whether this entity contains references to persistent collections.

Usage

From source file:org.codehaus.groovy.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor.java

License:Apache License

@Override
protected Serializable performSaveOrReplicate(Object entity, EntityKey key, EntityPersister persister,
        boolean useIdentityColumn, Object anything, EventSource source, boolean requiresImmediateIdAccess) {
    validate(entity, persister, source);

    Serializable id = key == null ? null : key.getIdentifier();

    boolean inTxn = source.getJDBCContext().isTransactionInProgress();
    boolean shouldDelayIdentityInserts = !inTxn && !requiresImmediateIdAccess;

    // Put a placeholder in entries, so we don't recurse back and try to save() the
    // same object again. QUESTION: should this be done before onSave() is called?
    // likewise, should it be done before onUpdate()?
    source.getPersistenceContext().addEntry(entity, Status.SAVING, null, null, id, null, LockMode.WRITE,
            useIdentityColumn, persister, false, false);

    cascadeBeforeSave(source, persister, entity, anything);

    if (useIdentityColumn && !shouldDelayIdentityInserts) {
        log.trace("executing insertions");
        source.getActionQueue().executeInserts();
    }//  w w w  . j  ava 2  s .  co m

    Object[] values = persister.getPropertyValuesToInsert(entity, getMergeMap(anything), source);
    Type[] types = persister.getPropertyTypes();

    boolean substitute = substituteValuesIfNecessary(entity, id, values, persister, source);

    if (persister.hasCollections()) {
        substitute = substitute || visitCollectionsBeforeSave(entity, id, values, types, source);
    }

    if (substitute) {
        persister.setPropertyValues(entity, values, source.getEntityMode());
    }

    TypeHelper.deepCopy(values, types, persister.getPropertyUpdateability(), values, source);

    new ForeignKeys.Nullifier(entity, false, useIdentityColumn, source).nullifyTransientReferences(values,
            types);
    new Nullability(source).checkNullability(values, persister, false);

    if (useIdentityColumn) {
        EntityIdentityInsertAction insert = new EntityIdentityInsertAction(values, entity, persister, source,
                shouldDelayIdentityInserts);
        if (!shouldDelayIdentityInserts) {
            log.debug("executing identity-insert immediately");
            source.getActionQueue().execute(insert);
            id = insert.getGeneratedId();
            if (id != null) {
                // As of HHH-3904, if the id is null the operation was vetoed so we bail
                key = new EntityKey(id, persister, source.getEntityMode());
                source.getPersistenceContext().checkUniqueness(key, entity);
            }
        } else {
            log.debug("delaying identity-insert due to no transaction in progress");
            source.getActionQueue().addAction(insert);
            key = insert.getDelayedEntityKey();
        }
    }

    if (key != null) {
        Object version = Versioning.getVersion(values, persister);
        source.getPersistenceContext().addEntity(entity,
                (persister.isMutable() ? Status.MANAGED : Status.READ_ONLY), values, key, version,
                LockMode.WRITE, useIdentityColumn, persister, isVersionIncrementDisabled(), false);
        //source.getPersistenceContext().removeNonExist(new EntityKey(id, persister, source.getEntityMode()));

        if (!useIdentityColumn) {
            source.getActionQueue()
                    .addAction(new EntityInsertAction(id, values, entity, version, persister, source));
        }

        cascadeAfterSave(source, persister, entity, anything);
        // Very unfortunate code, but markInterceptorDirty is private. Once HHH-3904 is resolved remove this overridden method!
        if (markInterceptorDirtyMethod != null) {
            ReflectionUtils.invokeMethod(markInterceptorDirtyMethod, this, entity, persister, source);
        }
    }

    return id;
}

From source file:owldb.util.OWLDBEventListener.java

License:Open Source License

/**
 * Reassociate an Object to the Session provided.
 * /*from  w  w w. java 2  s . c  o m*/
 * @param source The session implementor source
 * @param object Worked object
 * @param result The loaded object
 * @param status The Hibernate status
 */
private void reassociateObject(final SessionImplementor source, final Object object, final Object result,
        final Status status) {
    final Serializable id = result instanceof OWLObject ? this.getID(source, (OWLObject) result)
            : source.getContextEntityIdentifier(result);
    if (id == null)
        return;

    final EntityPersister persister = source.getEntityPersister(null, object);
    final EntityMode entityMode = source.getEntityMode();
    final EntityKey key = new EntityKey(id, persister, entityMode);

    // Get a snapshot
    final Type[] types = persister.getPropertyTypes();
    final Object[] resultValues = persister.getPropertyValues(result, entityMode);
    final Object[] values = persister.getPropertyValues(object, entityMode);

    if (persister.hasCollections()) {
        for (int i = 0; i < types.length; i++) {
            if (!types[i].isCollectionType())
                continue;

            if (values[i] instanceof Collection<?>) {
                final Collection<?> unsavedCol = (Collection<?>) values[i];
                final CollectionType collectionType = (CollectionType) types[i];
                final CollectionPersister colPersister = source.getFactory()
                        .getCollectionPersister(collectionType.getRole());
                final PersistenceContext persistenceContext = source.getPersistenceContext();
                final PersistentCollection persistentCollection = collectionType.wrap(source, unsavedCol);
                final PersistentCollection resultCol = (PersistentCollection) resultValues[i];
                final Serializable currentKey = resultCol.getKey();
                persistenceContext.addInitializedCollection(colPersister, persistentCollection, currentKey);
                values[i] = persistentCollection;
            }

            persister.setPropertyValues(object, values, entityMode);
        }
    }

    TypeHelper.deepCopy(values, types, persister.getPropertyUpdateability(), values, source);
    final Object version = Versioning.getVersion(values, persister);

    // lazyPropertiesAreUnfetched: Will be ignored, using the existing Entry
    // instead
    source.getPersistenceContext().addEntity(object, status, values, key, version, LockMode.NONE, true,
            persister, false, true);
    persister.afterReassociate(object, source);
}