entityTuple.put( columnName, tuple.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.updateTuple( entityTuple, entityKey, persister.getTupleContext() ); // update cache
}
else if ( associationType == AssociationType.ASSOCIATION_TABLE_TO_ENTITY ) {
String[] elementColumnNames = getElementColumnNames();
Object[] elementColumnValues = LogicalPhysicalConverterHelper.getColumnValuesFromResultset( tuple, elementColumnNames );
Serializable entityId = (Serializable) gridTypeOfAssociatedId.nullSafeGet( tuple, getElementColumnNames(), session, null );
AssociationPersister associationPersister = new AssociationPersister(
getElementPersister().getMappedClass()
)
.gridDialect( gridDialect )
.keyColumnValues( elementColumnValues )
.session( session )
.associationKeyMetadata( associationKeyMetadataFromElement )
.collectionPersister( this )
.key( entityId )
.inverse();
// 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 = updateRowKeyEntityKey( rowKey, associationPersister );
Tuple assocTuple = associationPersister.createAndPutAssociationTuple( inverseRowKey );
for ( String columnName : tuple.getColumnNames() ) {
assocTuple.put( columnName, tuple.get( columnName ) );
}
associationPersister.getAssociation().put( inverseRowKey, assocTuple );
}
else if ( action == Action.REMOVE ) {
// we try and match the whole tuple as it should be on both sides of the navigation
if ( rowKey == null ) {
throw new AssertionFailure( "Deleting a collection tuple that is not present: " + "table {"
+ getTableName() + "} key column names {" + Arrays.toString( elementColumnNames )
+ "} key column values {" + Arrays.toString( elementColumnValues ) + "}" );
}
RowKey inverseRowKey = updateRowKeyEntityKey( rowKey, associationPersister );
associationPersister.getAssociation().remove( inverseRowKey );
}
else {
throw new AssertionFailure( "Unknown action type: " + action );
}
if ( associationPersister.hostingEntityRequiresReadAfterUpdate() && entity == null ) {
entity = session.getPersistenceContext().getEntity( session.generateEntityKey( entityId, getElementPersister() ) );
}