// update the associated object
Serializable entityId = (Serializable) gridTypeOfAssociatedId.nullSafeGet( associationRow, getElementColumnNames(), session, null );
OgmEntityPersister persister = (OgmEntityPersister) getElementPersister();
final EntityKey entityKey = EntityKeyBuilder.fromPersister( persister, entityId, session );
final Tuple entityTuple = gridDialect.getTuple( entityKey, persister.getTupleContext() );
// the entity tuple could already be gone (not 100% sure this can happen but that feels right)
if ( entityTuple == null ) {
return;
}
if ( action == Action.ADD ) {
// copy all collection tuple entries in the entity tuple as this is the same table essentially
for ( String columnName : associationRow.getColumnNames() ) {
entityTuple.put( columnName, associationRow.get( columnName ) );
}
}
else if ( action == Action.REMOVE ) {
if ( hasIdentifier ) {
throw new AssertionFailure( "A true OneToMany with an identifier for the collection: " + getRole() );
}
if ( hasIndex ) {
// nullify the index
indexGridType.nullSafeSet( entityTuple, null, getIndexColumnNames(), session );
}
keyGridType.nullSafeSet( entityTuple, null, getKeyColumnNames(), session );
}
else {
throw new AssertionFailure( "Unknown action type: " + action );
}
gridDialect.insertOrUpdateTuple( entityKey, entityTuple, persister.getTupleContext() ); // update cache
}
else if ( associationType == AssociationType.ASSOCIATION_TABLE_TO_ENTITY ) {
String[] elementColumnNames = getElementColumnNames();
Object[] elementColumnValues = LogicalPhysicalConverterHelper.getColumnValuesFromResultset( associationRow, elementColumnNames );
Serializable entityId = (Serializable) gridTypeOfAssociatedId.nullSafeGet( associationRow, getElementColumnNames(), session, null );
if ( inverseCollectionPersister == null ) {
return;
}
if ( entity == null ) {
entity = session.getPersistenceContext().getEntity( session.generateEntityKey( entityId, getElementPersister() ) );
}
AssociationPersister associationPersister = inverseCollectionPersister.getAssociationPersister( entity, elementColumnValues, session );
// TODO what happens when a row should be *updated* ?: I suspect ADD works OK as it's a put()
if ( action == Action.ADD ) {
RowKey inverseRowKey = getInverseRowKey( associationRow );
Tuple inverseAssociationRow = new Tuple();
associationPersister.getAssociation().put( inverseRowKey, inverseAssociationRow );
for ( String columnName : associationRow.getColumnNames() ) {
inverseAssociationRow.put( columnName, associationRow.get( columnName ) );
}
associationPersister.getAssociation().put( inverseRowKey, inverseAssociationRow );
}
else if ( action == Action.REMOVE ) {
// we try and match the whole tuple as it should be on both sides of the navigation