protected void addManyToManyMappingLines(NonreflectiveMethodDefinition method, String mappingName, ManyToManyMapping mapping) { if (mapping.getRelationTable() != null) { method.addLine(mappingName + ".setRelationTableName(\"" + mapping.getRelationTable().getQualifiedName() + "\");"); } Enumeration sourceRelationKeysEnum = mapping.getSourceRelationKeyFields().elements(); Enumeration sourceKeysEnum = mapping.getSourceKeyFields().elements(); while (sourceRelationKeysEnum.hasMoreElements()) { DatabaseField sourceField = (DatabaseField)sourceKeysEnum.nextElement(); DatabaseField relationField = (DatabaseField)sourceRelationKeysEnum.nextElement(); method.addLine(mappingName + ".addSourceRelationKeyFieldName(\"" + relationField.getQualifiedName() + "\", \"" + sourceField.getQualifiedName() + "\");"); } Enumeration targetRelationKeysEnum = mapping.getTargetRelationKeyFields().elements(); Enumeration targetKeysEnum = mapping.getTargetKeyFields().elements(); while (targetRelationKeysEnum.hasMoreElements()) { DatabaseField targetField = (DatabaseField)targetKeysEnum.nextElement(); DatabaseField relationField = (DatabaseField)targetRelationKeysEnum.nextElement(); method.addLine(mappingName + ".addTargetRelationKeyFieldName(\"" + relationField.getQualifiedName() + "\", \"" + targetField.getQualifiedName() + "\");"); } addHistoryPolicyLines(method, mapping, mappingName); }
if (!getDeleteAllQuery().hasSessionName()) { getDeleteAllQuery().setSessionName(session.getName()); getDeleteAllQuery().setName(getAttributeName()); if (getDeleteAllQuery().getPartitioningPolicy() == null) { getDeleteAllQuery().setPartitioningPolicy(getPartitioningPolicy()); if (hasCustomDeleteAllQuery()) { return; for (int index = 0; index < getSourceRelationKeyFields().size(); index++) { DatabaseField sourceRelationKey = getSourceRelationKeyFields().elementAt(index); DatabaseField sourceKey = getSourceKeyFields().elementAt(index); statement.setTable(getRelationTable()); getDeleteAllQuery().setSQLStatement(statement);
/** * INTERNAL: * Update the relation table with the entries related to this mapping. * Delete entries removed, insert entries added. * If private also insert/delete/update target objects. */ public void postUpdate(WriteObjectQuery query) throws DatabaseException { if (isReadOnly()) { return; } // If objects are not instantiated that means they are not changed. if (!isAttributeValueInstantiatedOrChanged(query.getObject())) { return; } Object objectsInMemoryModel = getRealCollectionAttributeValueFromObject(query.getObject(), query.getSession()); // This accesses the backup in uow otherwise goes to database (may be better of to delete all in non uow case). Object currentObjectsInDB = readPrivateOwnedForObject(query); if (currentObjectsInDB == null) { currentObjectsInDB = getContainerPolicy().containerInstance(1); } compareObjectsAndWrite(currentObjectsInDB, objectsInMemoryModel, query); }
protected void addHistoryPolicyLines(NonreflectiveMethodDefinition method, ManyToManyMapping mapping, String mappingName) { if (mapping.getHistoryPolicy() == null) { return; } String policyName = mapping.getAttributeName() + "HistoryPolicy"; addHistoryPolicyLines(method, mapping.getHistoryPolicy(), policyName); method.addLine(mappingName + ".setHistoryPolicy(" + policyName + ");"); }
@Override public Object getAttributeValueFromObject(Object object) { List sourceFields = ((ManyToManyMapping)object).getSourceKeyFields(); List relationFields = ((ManyToManyMapping)object).getSourceRelationKeyFields(); List associations = new ArrayList(sourceFields.size()); for (int index = 0; index < sourceFields.size(); index++) { associations.add(new Association(relationFields.get(index), sourceFields.get(index))); } return associations; }
@Override public Object getAttributeValueFromObject(Object object) { List targetFields = ((ManyToManyMapping)object).getTargetKeyFields(); List relationFields = ((ManyToManyMapping)object).getTargetRelationKeyFields(); List associations = new ArrayList(targetFields.size()); for (int index = 0; index < targetFields.size(); index++) { associations.add(new Association(relationFields.get(index), targetFields.get(index))); } return associations; }
DatabaseMapping mapping = clonedDescriptor.getMappingForAttributeName(overrideMapping.getAttributeName()); mappingClone.setRelationTable(overrideMapping.getRelationTable()); mappingClone.setSourceKeyFields(overrideMapping.getSourceKeyFields()); mappingClone.setSourceRelationKeyFields(overrideMapping.getSourceRelationKeyFields()); mappingClone.setTargetKeyFields(overrideMapping.getTargetKeyFields()); mappingClone.setTargetRelationKeyFields(overrideMapping.getTargetRelationKeyFields());
getDescriptor().getPreDeleteMappings().add(this); if (shouldInitializeSelectionCriteria()) { if (shouldForceInitializationOfSelectionCriteria()) { initializeSelectionCriteriaAndAddFieldsToQuery(null); } else { initializeSelectionCriteriaAndAddFieldsToQuery(getSelectionCriteria()); if (!getSelectionQuery().hasSessionName()) { getSelectionQuery().setSessionName(session.getName()); initializeDeleteAllQuery(session); if (getHistoryPolicy() != null) { getHistoryPolicy().initialize(session); if (getReferenceDescriptor() != null && getReferenceDescriptor().hasTablePerClassPolicy()) { getReferenceDescriptor().getTablePerClassPolicy().prepareChildrenSelectionQuery(this, session);
ManyToManyMapping mapping = new ManyToManyMapping(); mapping.setAttributeName(name); mapping.setReferenceClass(refType.getJavaClass()); mapping.setRelationTableName(relationshipTableName); mapping.addSourceRelationKeyFieldName(sourcePK.getName(), sourcePK.getQualifiedName()); if (mapping.getSourceRelationKeyFieldNames().contains(relField)) { relField = refType.getName() + "_" + relField; mapping.addTargetRelationKeyFieldName(relField, targetPK.getQualifiedName()); mapping.useTransparentList();
if (isReadOnly()) { return; ContainerPolicy cp = getContainerPolicy(); Object objects = getRealCollectionAttributeValueFromObject(query.getObject(), query.getSession()); if (cp.isEmpty(objects)) { return; prepareTranslationRow(query.getTranslationRow(), query.getObject(), query.getSession()); AbstractRecord databaseRow = this.mechanism.buildRelationTableSourceRow(query.getTranslationRow()); if ((getHistoryPolicy() != null) && getHistoryPolicy().shouldHandleWrites()) { getHistoryPolicy().mappingLogicalInsert(this.mechanism.getInsertQuery(), databaseRow, query.getSession());
ContainerPolicy containerPolicy = getContainerPolicy(); if (isReadOnly()) { return; boolean cascade = shouldObjectModifyCascadeToParts(query); if (containerPolicy.propagatesEventsToCollection() || cascade) { objects = getRealCollectionAttributeValueFromObject(query.getObject(), querySession); earlyPreDelete(query);
/** * Initialize delete all query. This query is used to all relevant rows from the * relation table. */ protected void initializeDeleteAllQuery(AbstractSession session) { if (!getDeleteAllQuery().hasSessionName()) { getDeleteAllQuery().setSessionName(session.getName()); } if (hasCustomDeleteAllQuery()) { return; } Expression expression = null; Expression subExpression; Expression builder = new ExpressionBuilder(); SQLDeleteStatement statement = new SQLDeleteStatement(); // Construct an expression to delete from the relation table. for (int index = 0; index < getSourceRelationKeyFields().size(); index++) { DatabaseField sourceRelationKey = getSourceRelationKeyFields().elementAt(index); DatabaseField sourceKey = getSourceKeyFields().elementAt(index); subExpression = builder.getField(sourceRelationKey).equal(builder.getParameter(sourceKey)); expression = subExpression.and(expression); } // All the entries are deleted in one shot. statement.setWhereClause(expression); statement.setTable(getRelationTable()); getDeleteAllQuery().setSQLStatement(statement); }
@Override public void setAttributeValueInObject(Object object, Object value) { ManyToManyMapping mapping = (ManyToManyMapping)object; List associations = (List)value; mapping.setTargetKeyFields(NonSynchronizedVector.newInstance(associations.size())); mapping.setTargetRelationKeyFields(NonSynchronizedVector.newInstance(associations.size())); Iterator iterator = associations.iterator(); while (iterator.hasNext()) { Association association = (Association)iterator.next(); mapping.getTargetKeyFields().add((DatabaseField)association.getValue()); mapping.getTargetRelationKeyFields().add((DatabaseField)association.getKey()); } } });
public void setAttributeValueInObject(Object object, Object value) { ManyToManyMapping mapping = (ManyToManyMapping)object; List associations = (List)value; mapping.setSourceKeyFields(NonSynchronizedVector.newInstance(associations.size())); mapping.setSourceRelationKeyFields(NonSynchronizedVector.newInstance(associations.size())); Iterator iterator = associations.iterator(); while (iterator.hasNext()) { Association association = (Association)iterator.next(); mapping.getSourceKeyFields().add((DatabaseField)association.getValue()); mapping.getSourceRelationKeyFields().add((DatabaseField)association.getKey()); } } });
if (!shouldObjectModifyCascadeToParts(query)) { return; Object objects = getRealCollectionAttributeValueFromObject(query.getObject(), query.getSession()); ContainerPolicy cp = getContainerPolicy(); if (cp.isEmpty(objects)) { return; Object wrappedObject = cp.next(objectsIterator, query.getSession()); Object object = cp.unwrapIteratorResult(wrappedObject); if (isPrivateOwned()) {
/** * INTERNAL: * Return the base expression to use for adding fields to the query. * Normally this is the query's builder, but may be the join table for m-m. */ @Override protected Expression getAdditionalFieldsBaseExpression(ReadQuery query) { return ((ReadAllQuery)query).getExpressionBuilder().getTable(getRelationTable()); }
final String attributeName = databaseMapping.getAttributeName(); // externalSystems Class<?> referenceClazz = databaseMapping.getReferenceClass(); final RelationalDescriptor descriptor = (RelationalDescriptor) databaseMapping.getDescriptor(); final RelationTableMechanism mechanism = databaseMapping.getRelationTableMechanism();
/** * INTERNAL: * An object was added to the collection during an update, insert it. */ protected void insertAddedObjectEntry(ObjectLevelModifyQuery query, Object objectAdded, Map extraData) throws DatabaseException, OptimisticLockException { //cr 3819 added the line below to fix the translationtable to ensure that it // contains the required values prepareTranslationRow(query.getTranslationRow(), query.getObject(), query.getDescriptor(), query.getSession()); AbstractRecord databaseRow = this.mechanism.buildRelationTableSourceAndTargetRow(query.getTranslationRow(), containerPolicy.unwrapIteratorResult(objectAdded), query.getSession(), this); ContainerPolicy.copyMapDataToRow(getContainerPolicy().getKeyMappingDataForWriteQuery(objectAdded, query.getSession()), databaseRow); if(listOrderField != null && extraData != null) { databaseRow.put(listOrderField, extraData.get(listOrderField)); } query.getExecutionSession().executeQuery(this.mechanism.getInsertQuery(), databaseRow); if ((getHistoryPolicy() != null) && getHistoryPolicy().shouldHandleWrites()) { getHistoryPolicy().mappingLogicalInsert(this.mechanism.getInsertQuery(), databaseRow, query.getSession()); } }
/** * INTERNAL: * Extract the source primary key value from the relation row. * Used for batch reading, most following same order and fields as in the mapping. */ protected Vector extractKeyFromTargetRow(AbstractRecord row, AbstractSession session) { Vector key = new Vector(getSourceRelationKeyFields().size()); for (int index = 0; index < getSourceRelationKeyFields().size(); index++) { DatabaseField relationField = getSourceRelationKeyFields().elementAt(index); DatabaseField sourceField = getSourceKeyFields().elementAt(index); Object value = row.get(relationField); // Must ensure the classification gets a cache hit. try { value = session.getDatasourcePlatform().getConversionManager().convertObject(value, getDescriptor().getObjectBuilder().getFieldClassification(sourceField)); } catch (ConversionException e) { throw ConversionException.couldNotBeConverted(this, getDescriptor(), e); } key.addElement(value); } return key; }
/** * INTERNAL: * Verifies listOrderField's table: it must be relation table. * Precondition: listOrderField != null. */ protected void buildListOrderField() { if(this.listOrderField.hasTableName()) { if(!getRelationTable().equals(this.listOrderField.getTable())) { throw DescriptorException.listOrderFieldTableIsWrong(this.getDescriptor(), this, this.listOrderField.getTable(), getRelationTable()); } } else { listOrderField.setTable(getRelationTable()); } this.listOrderField = getDescriptor().buildField(this.listOrderField, getRelationTable()); }