I've always found it difficult to trace back to where merges caused stale copies of an object to appear, resulting in Optimistic Locking Exceptions.
Q: Would it be reasonable to add some functionality to the StateComparisonVersionStrategy such that if a conflict is encountered that the offending field and its conflicting values be displayed, either in the Exception itself or in the log? It looks like ArrayStateImage.sameVersion would need to reflect back the failing column index.