I have just double checked this, and I can verify that the problem is in your code. When you remove an item from the middle of a list, the indices are recomputed, list.size() is correct, etc. All works as expected. In fact, hibernate is a little too conservative in ensuring that all is well, because the generated SQL (for my test tables) is:
Code:
Hibernate: delete from ConfigToLoggerLink where CollectionConfigurationID=?
Hibernate: insert into ConfigToLoggerLink (CollectionConfigurationID, SequenceNumber, LoggerID) values (?, ?, ?)
Hibernate: insert into ConfigToLoggerLink (CollectionConfigurationID, SequenceNumber, LoggerID) values (?, ?, ?)
As you can see, it completely wipes out the link table, reinserting all values, even though it could get away with deleting one row and updating all rows with indices higher than the deleted one.
Could you be working with a detached instance, or a mixture of detached and persistent instances? Can you include (in code tags) the relevant code from updateFieldsFromTableRow()?