/** * INTERNAL: * Initialize the mapping. */ @Override public void postInitialize(AbstractSession session) throws DescriptorException { super.postInitialize(session); if (getReferenceDescriptor() != null) { getReferenceDescriptor().getCachePolicy().setCacheIsolation(this.descriptor.getCachePolicy().getCacheIsolation()); // Changed as part of fix for bug#4410581 aggregate mapping can not be set to use change tracking if owning descriptor does not use it. // Basically the policies should be the same, but we also allow deferred with attribute for CMP2 (courser grained). if (getDescriptor().getObjectChangePolicy().getClass().equals(DeferredChangeDetectionPolicy.class)) { getReferenceDescriptor().setObjectChangePolicy(new DeferredChangeDetectionPolicy()); } else if (getDescriptor().getObjectChangePolicy().getClass().equals(ObjectChangeTrackingPolicy.class) && getReferenceDescriptor().getObjectChangePolicy().getClass().equals(AttributeChangeTrackingPolicy.class)) { getReferenceDescriptor().setObjectChangePolicy(new ObjectChangeTrackingPolicy()); } } }
/** * INTERNAL: * Clear the changes in the ObjectChangeListener */ public void clearChanges(Object clone, UnitOfWorkImpl uow, ClassDescriptor descriptor, boolean forRefresh) { ObjectChangeListener listener = (ObjectChangeListener)((ChangeTracker)clone)._persistence_getPropertyChangeListener(); if (listener != null) { listener.clearChanges(forRefresh); } else { listener = (ObjectChangeListener)setChangeListener(clone, uow, descriptor); } ObjectBuilder builder = descriptor.getObjectBuilder(); // Only relationship mappings need to be reset. if (!builder.isSimple()) { dissableEventProcessing(clone); // Must also ensure the listener has been set on collections and aggregates. FetchGroupManager fetchGroupManager = descriptor.getFetchGroupManager(); boolean isPartialObject = (fetchGroupManager != null) && fetchGroupManager.isPartialObject(clone); List mappings = builder.getRelationshipMappings(); int size = mappings.size(); // Only cascade fetched mappings. for (int index = 0; index < size; index++) { DatabaseMapping mapping = (DatabaseMapping)mappings.get(index); if (!isPartialObject || fetchGroupManager.isAttributeFetched(clone, mapping.getAttributeName())) { mapping.setChangeListener(clone, listener, uow); } } enableEventProcessing(clone); } }
/** * INTERNAL: * Clear the changes in the ObjectChangeListener */ public void clearChanges(Object clone, UnitOfWorkImpl uow, ClassDescriptor descriptor, boolean forRefresh) { ObjectChangeListener listener = (ObjectChangeListener)((ChangeTracker)clone)._persistence_getPropertyChangeListener(); if (listener != null) { listener.clearChanges(forRefresh); } else { listener = (ObjectChangeListener)setChangeListener(clone, uow, descriptor); } ObjectBuilder builder = descriptor.getObjectBuilder(); // Only relationship mappings need to be reset. if (!builder.isSimple()) { dissableEventProcessing(clone); // Must also ensure the listener has been set on collections and aggregates. FetchGroupManager fetchGroupManager = descriptor.getFetchGroupManager(); boolean isPartialObject = (fetchGroupManager != null) && fetchGroupManager.isPartialObject(clone); List mappings = builder.getRelationshipMappings(); int size = mappings.size(); // Only cascade fetched mappings. for (int index = 0; index < size; index++) { DatabaseMapping mapping = (DatabaseMapping)mappings.get(index); if (!isPartialObject || fetchGroupManager.isAttributeFetched(clone, mapping.getAttributeName())) { mapping.setChangeListener(clone, listener, uow); } } enableEventProcessing(clone); } }
/** * INTERNAL: */ public void process(MetadataDescriptor descriptor) { // Set the change tracking flag on the Metadata Descriptor. descriptor.setHasChangeTracking(); // Process the change tracking metadata. ClassDescriptor classDescriptor = descriptor.getClassDescriptor(); if (m_type == null || m_type.equals(ChangeTrackingType.AUTO.name())) { // By setting the policy to null, this will unset any global // settings. EclipseLink will then determine the change tracking // policy at runtime. classDescriptor.setObjectChangePolicy(null); } else if (m_type.equals(ChangeTrackingType.ATTRIBUTE.name())) { classDescriptor.setObjectChangePolicy(new AttributeChangeTrackingPolicy()); } else if (m_type.equals(ChangeTrackingType.OBJECT.name())) { classDescriptor.setObjectChangePolicy(new ObjectChangeTrackingPolicy()); } else if (m_type.equals(ChangeTrackingType.DEFERRED.name())) { classDescriptor.setObjectChangePolicy(new DeferredChangeDetectionPolicy()); } }
/** * INTERNAL: * Clear the changes in the ObjectChangeListener */ public void clearChanges(Object clone, UnitOfWorkImpl uow, ClassDescriptor descriptor) { ObjectChangeListener listener = (ObjectChangeListener)((ChangeTracker)clone)._persistence_getPropertyChangeListener(); if (listener != null) { listener.clearChanges(); } else { listener = (ObjectChangeListener)setChangeListener(clone, uow, descriptor); } ObjectBuilder builder = descriptor.getObjectBuilder(); // Only relationship mappings need to be reset. if (!builder.isSimple()) { dissableEventProcessing(clone); // Must also ensure the listener has been set on collections and aggregates. FetchGroupManager fetchGroupManager = descriptor.getFetchGroupManager(); boolean isPartialObject = (fetchGroupManager != null) && fetchGroupManager.isPartialObject(clone); List mappings = builder.getRelationshipMappings(); int size = mappings.size(); // Only cascade fetched mappings. for (int index = 0; index < size; index++) { DatabaseMapping mapping = (DatabaseMapping)mappings.get(index); if (!isPartialObject || fetchGroupManager.isAttributeFetched(clone, mapping.getAttributeName())) { mapping.setChangeListener(clone, listener, uow); } } enableEventProcessing(clone); } }
/** * INTERNAL: * For an aggregate mapping the reference descriptor is cloned. The cloned descriptor is then * assigned primary keys and table names before initialize. Once the cloned descriptor is initialized * it is assigned as reference descriptor in the aggregate mapping. This is a very specific * behavior for aggregate mappings. The original descriptor is used only for creating clones and * after that the aggregate mapping never uses it. * Some initialization is done in postInitialize to ensure the target descriptor's references are initialized. */ public void postInitialize(AbstractSession session) throws DescriptorException { super.postInitialize(session); if (getReferenceDescriptor() != null) { // Changed as part of fix for bug#4410581 aggregate mapping can not be set to use change tracking if owning descriptor does not use it. // Basically the policies should be the same, but we also allow deferred with attribute for CMP2 (courser grained). if (getDescriptor().getObjectChangePolicy().getClass().equals(DeferredChangeDetectionPolicy.class)) { getReferenceDescriptor().setObjectChangePolicy(new DeferredChangeDetectionPolicy()); } else if (getDescriptor().getObjectChangePolicy().getClass().equals(ObjectChangeTrackingPolicy.class) && getReferenceDescriptor().getObjectChangePolicy().getClass().equals(AttributeChangeTrackingPolicy.class)) { getReferenceDescriptor().setObjectChangePolicy(new ObjectChangeTrackingPolicy()); } getReferenceDescriptor().postInitialize(session); } }
/** * INTERNAL: * Initialize the mapping. */ @Override public void postInitialize(AbstractSession session) throws DescriptorException { super.postInitialize(session); if (getReferenceDescriptor() != null) { getReferenceDescriptor().getCachePolicy().setCacheIsolation(this.descriptor.getCachePolicy().getCacheIsolation()); // Changed as part of fix for bug#4410581 aggregate mapping can not be set to use change tracking if owning descriptor does not use it. // Basically the policies should be the same, but we also allow deferred with attribute for CMP2 (courser grained). if (getDescriptor().getObjectChangePolicy().getClass().equals(DeferredChangeDetectionPolicy.class)) { getReferenceDescriptor().setObjectChangePolicy(new DeferredChangeDetectionPolicy()); } else if (getDescriptor().getObjectChangePolicy().getClass().equals(ObjectChangeTrackingPolicy.class) && getReferenceDescriptor().getObjectChangePolicy().getClass().equals(AttributeChangeTrackingPolicy.class)) { getReferenceDescriptor().setObjectChangePolicy(new ObjectChangeTrackingPolicy()); } } }
} else if (getDescriptor().getObjectChangePolicy().getClass().equals(ObjectChangeTrackingPolicy.class) && getReferenceDescriptor().getObjectChangePolicy().getClass().equals(AttributeChangeTrackingPolicy.class)) { getReferenceDescriptor().setObjectChangePolicy(new ObjectChangeTrackingPolicy());
} else if (getDescriptor().getObjectChangePolicy().getClass().equals(ObjectChangeTrackingPolicy.class) && getReferenceDescriptor().getObjectChangePolicy().getClass().equals(AttributeChangeTrackingPolicy.class)) { getReferenceDescriptor().setObjectChangePolicy(new ObjectChangeTrackingPolicy());
private void customizeObjectChangePolicy(final ClassDescriptor clazzDescriptor, final Session session) { final String propertyValue = (String) session.getProperty( PersistenceUnitProperties.ZALANDO_ECLIPSELINK_CHANGE_TRACKER_NAME); ChangeTrackingType changeTrackingType = ChangeTrackingType.AUTO; if (propertyValue != null && (!propertyValue.trim().isEmpty())) { try { changeTrackingType = ChangeTrackingType.valueOf(propertyValue); } catch (Exception e) { logWarning(session, COULD_NOT_DETERMINE_CHANGE_TRACKING_TYPE, propertyValue); changeTrackingType = ChangeTrackingType.AUTO; } } switch (changeTrackingType) { case DEFERRED : clazzDescriptor.setObjectChangePolicy(new DeferredChangeDetectionPolicy()); logFine(session, SET_OBJECT_CHANGE_POLICY_TO, DEFERRED_CHANGE_DETECTION_POLICY); break; case OBJECT : clazzDescriptor.setObjectChangePolicy(new ObjectChangeTrackingPolicy()); logFine(session, SET_OBJECT_CHANGE_POLICY_TO, OBJECT_CHANGE_TRACKING_POLICY); break; case ATTRIBUTE : clazzDescriptor.setObjectChangePolicy(new AttributeChangeTrackingPolicy()); logFine(session, SET_OBJECT_CHANGE_POLICY_TO, ATTRIBUTE_CHANGE_TRACKING_POLICY); break; case AUTO : default : logFine(session, USE_DEFAULT_CHANGE_TRACKING_POLICY); } }
} else if (getDescriptor().getObjectChangePolicy().getClass().equals(ObjectChangeTrackingPolicy.class) && getReferenceDescriptor().getObjectChangePolicy().getClass().equals(AttributeChangeTrackingPolicy.class)) { getReferenceDescriptor().setObjectChangePolicy(new ObjectChangeTrackingPolicy());
/** * INTERNAL: * For an aggregate mapping the reference descriptor is cloned. The cloned descriptor is then * assigned primary keys and table names before initialize. Once the cloned descriptor is initialized * it is assigned as reference descriptor in the aggregate mapping. This is a very specific * behavior for aggregate mappings. The original descriptor is used only for creating clones and * after that the aggregate mapping never uses it. * Some initialization is done in postInitialize to ensure the target descriptor's references are initialized. */ @Override public void postInitialize(AbstractSession session) throws DescriptorException { super.postInitialize(session); if (getReferenceDescriptor() != null) { getReferenceDescriptor().getCachePolicy().setCacheIsolation(this.descriptor.getCachePolicy().getCacheIsolation()); // Changed as part of fix for bug#4410581 aggregate mapping can not be set to use change tracking if owning descriptor does not use it. // Basically the policies should be the same, but we also allow deferred with attribute for CMP2 (courser grained). if (getDescriptor().getObjectChangePolicy().getClass().equals(DeferredChangeDetectionPolicy.class)) { getReferenceDescriptor().setObjectChangePolicy(new DeferredChangeDetectionPolicy()); } else if (getDescriptor().getObjectChangePolicy().getClass().equals(ObjectChangeTrackingPolicy.class) && getReferenceDescriptor().getObjectChangePolicy().getClass().equals(AttributeChangeTrackingPolicy.class)) { getReferenceDescriptor().setObjectChangePolicy(new ObjectChangeTrackingPolicy()); } //need to set the primary key classification as the mappings for the pk fields might not be available if (getReferenceDescriptor().isAggregateDescriptor()){ getReferenceDescriptor().getObjectBuilder().setPrimaryKeyClassifications(this.getDescriptor().getObjectBuilder().getPrimaryKeyClassifications()); getReferenceDescriptor().setHasSimplePrimaryKey(this.getDescriptor().hasSimplePrimaryKey()); } getReferenceDescriptor().postInitialize(session); } }